Google 的 Protocol Buffers 是否能有效地自动对齐数据?

joh*_*ers 5 c++ protocol-buffers

在典型的 C 或 C++ 中struct,开发人员必须以提供有效内存对齐和填充的方式显式排序数据成员,如果这是一个问题。

Google 的 Protocol Buffers 的行为很像structs 并且不清楚这些的编译如何影响内存布局。有谁知道这种为了有效的内存布局而以特定顺序组织数据的趋势是否由协议缓冲区编译器自动处理?我一直无法找到这方面的任何信息。

IE 缓冲区实际上可能在内部对数据进行排序,而不是message在 protobuf的对象中指定。

jun*_*nix 2

在典型的 C 或 C++ 结构中,开发人员必须以提供有效内存对齐和填充的方式显式对数据成员进行排序(如果这是一个问题)。

事实上这并不完全正确。

确实,大多数编译器(实际上是我所知道的)都倾向于将结构元素与机器字地址对齐。他们这样做是出于性能原因,因为从字地址读取并屏蔽掉一些位通常比从字地址读取并移位字更便宜,因此您正在寻找的值是右对齐的并且屏蔽掉了不需要的位。(当然这取决于你正在编译的架构)

那么为什么我上面引用的你的说法不正确呢?- 由于编译器按上述方式排列元素,因此它们还为程序员提供了影响此行为的机会。通常这是使用编译器特定的编译指示来完成的。

例如,GCC 和 MS C 编译器提供了一个名为“pack”的编译指示,它允许程序员更改编译器针对特定结构的对齐行为。当然,如果您选择将 pack 设置为“1”,则内存使用情况会有所改善,但这可能会影响您的运行时行为。

据我所知,编译器从未对结构中的成员进行重新排序。