Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 给定结构地址的结构字段的计算地址_C_Struct_Compiler Construction - Fatal编程技术网

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

C 给定结构地址的结构字段的计算地址,c,struct,compiler-construction,C,Struct,Compiler Construction,给定一个压缩(即假设没有对齐)结构: structfoo{ int x; int-y; }; 结构Foo*Foo; 将&foo->y翻译为foo+sizeof(int)(即foo->y的地址等于foo的地址加上int)是否“安全”(即在标准的某个地方定义) 我遵循类型的6.2.6表示法,但它没有说明字段如何存储在结构中 作为编译器作者,您可以选择任何填充的数量和大小 该标准规定,必须“按顺序”分配成员(第6.2.5节,第20段,第42页),除位字段外,它们占用字节(6.2.6.1,第44-45

给定一个压缩(即假设没有对齐)结构:

structfoo{
int x;
int-y;
};
结构Foo*Foo;
&foo->y
翻译为
foo+sizeof(int)
(即foo->y的地址等于foo的地址加上
int
)是否“安全”(即在标准的某个地方定义)

我遵循类型的
6.2.6表示法
,但它没有说明字段如何存储在结构中

作为编译器作者,您可以选择任何填充的数量和大小

该标准规定,必须“按顺序”分配成员(第6.2.5节,第20段,第42页),除位字段外,它们占用字节(6.2.6.1,第44-45页)。在大多数情况下,不需要太多其他东西

(编辑:另一项要求是第一个构件的偏移量为零。见第113页第6.7.2.1节第15段。)


ABI可能会制定更严格的要求。一般来说,作为一名编译器编写者,您可能不应该插入“不必要的”填充,但在这里定义“不必要的”则由您决定。如果您支持某种形式的“压缩”关键字或属性,请使用它启用或禁用插入的填充以获得明显的性能提升(例如,将4字节整数与4字节边界对齐的填充)。如果将int移动到缓存线边界可能会提高性能,但可能不会,请将其留给用户。

这一点非常接近。为什么不使用抵销呢<代码>(uintpttr_t)(void*)foo+offsetof(struct foo,y)?谢谢,但我不能,因为我正在为
C
实现一个玩具编译器。所以我想知道struct的数据布局是否定义在某个地方。是否由编译器来确定(缺少)填充?我认为这符合标准,但我不能引用任何东西;这不一定只是性能的问题。除非asker仔细编译内存访问,以使未对齐的加载和存储正确执行,否则可能需要填充代码才能运行。