5

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

Google 的 Protocol Buffers 的行为与structs 非常相似,目前尚不清楚它们的编译如何影响内存布局。有谁知道这种为了有效的内存布局而按特定顺序组织数据的趋势是否由协议缓冲区编译器自动处理?我一直找不到这方面的任何信息。

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

4

1 回答 1

2

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

事实上,这并不完全正确。

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

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

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

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

于 2013-07-09T08:08:50.430 回答