C语言 给定结构地址的结构字段的计算地址



给定一个打包(即假设没有对齐(结构:

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 移动到缓存行边界可能会提高性能,但可能不会,请将其留给用户。

最新更新