给定一个打包(即假设没有对齐(结构:
struct Foo {
int x;
int y;
};
struct Foo *foo;
将&foo->y
翻译为foo + sizeof(int)
是否"安全"(即 foo->y 的地址等于大小为int
的 foo 地址(?
我遵循 C11 标准6.2.6 Representations of types
但它没有说明字段如何在结构中存储。
作为编译器作者,您可以选择任何填充的数量和大小。
该标准规定,您必须"按顺序"分配成员(第 6.2.5 节,第 20 段,第 42 页(,并且除位字段外,它们占用字节(6.2.6.1,第 44-45 页(。 在大多数情况下,不需要太多其他东西。
(编辑:另一个要求是第一个成员的偏移量为零。 见第 6.7.2.1 节,第 15 段,第 113 页。
ABI 可能会提出自己更严格的要求。 通常,作为编译器编写者,您可能不应该插入"不必要的"填充,但在这里定义"不必要的"取决于您。 如果您支持某种形式的"packed"关键字或属性,请使用它来启用或禁用插入的填充,以明显提高性能(例如,在 4 字节边界上对齐 4 字节 int 的填充(。 如果将 int 移动到缓存行边界可能会提高性能,但可能不会,请将其留给用户。