给定结构地址计算结构字段的地址
Compute address of struct field given struct address
给定一个打包的(即假设没有对齐)结构:
struct Foo {
int x;
int y;
};
struct Foo *foo;
是否"safe"(即在标准某处定义)将&foo->y
翻译为foo + sizeof(int)
(即foo->y的地址等于添加的 foo 大小为 int
) ?
我正在关注 C11 standard 6.2.6 Representations of types
,但它没有说明字段在结构中的存储方式。
作为编译器作者,您可以选择任何填充的数量和大小。
标准规定您必须分配成员 "sequentially"(第 6.2.5 节,第 20 段,第 42 页)并且除了位域外,它们占用字节(6.2.6.1,第. 44-45).在大多数情况下不需要太多其他内容。
(编辑:另一个要求是第一个成员的偏移量为零。请参阅第 6.7.2.1 节,第 15 段,第 113 页。)
ABI 可能会提出自己更严格的要求。通常,作为编译器编写者,您可能 不应该 插入 "unnecessary" 填充,但您可以在此处定义 "unnecessary"。如果您支持某种形式的 "packed" 关键字或属性,请使用它来启用或禁用插入的填充以获得明显的性能提升(例如,将 4 字节 int 对齐到 4 字节边界的填充)。如果将 int 移动到 cache 行边界 可能会 提高性能,但可能不会,请将其留给用户。
给定一个打包的(即假设没有对齐)结构:
struct Foo {
int x;
int y;
};
struct Foo *foo;
是否"safe"(即在标准某处定义)将&foo->y
翻译为foo + sizeof(int)
(即foo->y的地址等于添加的 foo 大小为 int
) ?
我正在关注 C11 standard 6.2.6 Representations of types
,但它没有说明字段在结构中的存储方式。
作为编译器作者,您可以选择任何填充的数量和大小。
标准规定您必须分配成员 "sequentially"(第 6.2.5 节,第 20 段,第 42 页)并且除了位域外,它们占用字节(6.2.6.1,第. 44-45).在大多数情况下不需要太多其他内容。
(编辑:另一个要求是第一个成员的偏移量为零。请参阅第 6.7.2.1 节,第 15 段,第 113 页。)
ABI 可能会提出自己更严格的要求。通常,作为编译器编写者,您可能 不应该 插入 "unnecessary" 填充,但您可以在此处定义 "unnecessary"。如果您支持某种形式的 "packed" 关键字或属性,请使用它来启用或禁用插入的填充以获得明显的性能提升(例如,将 4 字节 int 对齐到 4 字节边界的填充)。如果将 int 移动到 cache 行边界 可能会 提高性能,但可能不会,请将其留给用户。