gpt4 book ai didi

c - 结构包装是确定性的吗?

转载 作者:太空狗 更新时间:2023-10-29 16:19:50 25 4
gpt4 key购买 nike

例如,假设我在不同的项目中有两个等效结构 ab:

typedef struct _a
{
int a;
double b;
char c;
} a;

typedef struct _b
{
int d;
double e;
char f;
} b;

假设我没有使用任何像 #pragma pack 这样的指令,并且这些结构是在相同的编译器上针对相同的体系结构和相同的优化设置编译的,它们之间的变量是否具有相同的填充?

最佳答案

编译器是确定性的;如果不是,单独的编译将是不可能的。具有相同 struct 声明的两个不同翻译单元将协同工作; §6.2.7/1: Compatible types and composite types 保证.

此外,同一平台上的两个不同编译器应该互操作,尽管标准不保证这一点。 (这是实现质量问题。)为了实现互操作性,编译器编写者同意平台 ABI(应用程序二进制接口(interface)),其中将包括如何表示复合类型的精确规范。这样,用一个编译器编译的程序就可以使用用不同编译器编译的库模块。

但是您不仅仅对确定论感兴趣;您还希望两种不同类型的布局相同。

根据标准,如果两个 struct 类型的成员(按顺序)兼容,并且它们的标签和成员名称相同,则它们是兼容的。由于您的示例 structs 具有不同的标签和名称,因此即使它们的成员类型兼容,它们也不兼容,因此您不能在需要另一个的地方使用一个。

该标准允许标记和成员名称影响兼容性,这似乎很奇怪。该标准要求结构的成员按声明顺序排列,因此名称不能更改结构中成员的顺序。那么,为什么它们会影响填充?我不知道他们在哪里使用任何编译器,但该标准的灵 active 基于这样的原则,即要求应该是保证正确执行所需的最低限度。翻译单元内不允许使用不同标记的结构别名,因此无需在不同翻译单元之间宽恕它。所以标准不允许这样做。 (实现在 struct 的填充字节中插入有关类型的信息是合法的,即使它需要确定性地添加填充以为此类信息提供空间。唯一的限制是填充不能放在 struct 的第一个成员之前。)

平台 ABI 可能会在不引用其标记或成员名称的情况下指定复合类型的布局。在特定平台上,使用具有此类规范的平台 ABI 和记录为符合平台 ABI 的编译器,您可以摆脱别名,尽管它在技术上不正确,而且显然先决条件使其不可移植.

关于c - 结构包装是确定性的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44485168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com