【发布时间】:2018-05-19 15:44:02
【问题描述】:
是否有任何保证在 C 中打包结构?
举个例子,假设sizeof(double) == 8,是否保证sizeof(struct { double x, y; }) == 16?
我知道这个问题背后的意图与严格的别名规则相冲突,因此假设严格别名被禁用,例如在 gcc 的情况下使用-fno-strict-aliasing。
为了避免任何进一步的猜测:目的是了解结构与其显式打包的对应物的兼容性。请注意,即使在以下情况下,别名也是相关的:Are C-structs with the same members types guaranteed to have the same layout in memory? 。不用担心我想访问单个字节。
【问题讨论】:
-
您的问题不包含任何别名。我害怕看到你打算如何添加它,因为你提出来了。
-
我知道的唯一保证是第一个成员之前没有填充。如果只有 1 个成员,则应该没有填充,所以
sizeof(struct { double x[2]; }) == 2 * sizeof(double)应该保持。 -
@StoryTeller 我怀疑他计划通过一些别名方法访问结构的字节,如果他知道如何打包的话。
-
@mch 我不确定你的第二点是否成立。考虑到指向不同数据类型的指针可以有不同的大小和对齐限制,但所有指向结构和联合类型的指针都具有相同的大小和对齐要求。因此,例如
char *可能比struct {char} *大,在这种情况下,结构可能需要比_Alignof(char)更大的对齐。