0

如果请求的接收者可以以与地址空间无关的方式表示,那么您可以将请求的命令对象传输到不同的进程并在那里完成请求。

来自:http ://www.worldcat.org/isbn/9780201633610

如何在 C++ 中以独立于地址空间的方式表示对象?

编辑:如何在 c++ 中以独立于地址空间的方式表示对象,以便将命令对象传输到不同的进程并能够满足请求?

4

3 回答 3

3

我没有那个设计模式:可重用的面向对象软件的元素书,但我猜作者的意思是算法不应该依赖于对象地址的实际值。

因此,如果您在某个键上使用某个哈希表,您将不会使用该键的地址进行哈希,而是使用一些与该键的内容相关的哈希。

您不希望程序的可观察行为依赖于ASLR

为了与其他进程通信,您最好使用序列化技术和格式(例如JSON),并且您不希望该格式依赖于实际地址(特别是,它不应该因为 ASLR 而改变)。

这并不意味着在最低级别,对象不包含地址或指针(因为指针在 C++ 中无处不在)。它只是意味着您不会关心这些地址的特定数值。

于 2016-01-11T06:09:31.103 回答
2

至于您的问题更新:

如何在c ++中以独立于地址空间的方式表示对象,以便将命令对象传输到不同的进程并能够满足请求?

这是使用反序列化将任何命令对象传递给另一个进程和适当的 IPC 技术(最简单的传输是基于套接字的通信恕我直言)来完成的。

没有用于反序列化的 c++ 标准惯用解决方案,但google protobufboost::serialization可以提供很好的帮助。

于 2016-01-11T06:20:26.603 回答
1

我认为您引用的段落来自命令模式。

该模式的描述也可以在不同站点的网络上找到。例如https://en.wikipedia.org/wiki/Command_pattern

命令模式的最常见表现形式是,其中与命令对应的数据以与地址空间无关的方式传输:

  1. 网络上的 HTTP/FTP 请求。
  2. CORBA 通过网络调用。
  3. MS Windows 中的 COM 调用。

我相信还有更多的技术可以让你在远程机器或不同的进程中执行命令。它们之所以能够工作,是因为命令可以以独立于地址空间的方式表示并通过网络或跨进程边界传输。

如何在 C++ 中以独立于地址空间的方式表示对象?

如果命令的发送者和接收者可以就基本类型(例如char, int, long, float, )的数据表示达成一致double,他们通常可以将它们用作构建块,以实现更高级别对象的发送和接收。

于 2016-01-11T06:26:12.867 回答