【问题标题】:Is the amount of padding in structure in C is Compiler dependent or well defined?C 中结构中的填充量是编译器依赖的还是定义明确的?
【发布时间】:2025-11-29 20:05:01
【问题描述】:

C struct 中的填充量是否在标准或编译器和/或目标体系结构中定义良好。我在标准中找不到答案。

【问题讨论】:

    标签: c padding


    【解决方案1】:

    它是实现定义的。来自 C99 标准的第 6.7.2.1 节:

    ...结构或联合对象的每个非位域成员在实现定义中对齐 适合其类型的方式...

    ...可能有未命名的 在结构对象内填充,但不是在其开头...

    编译器通常会选择适合底层硬件的排列方式(对齐内容以便于从内存中读取等)。

    【讨论】:

    • 我的回答是一样的,但我需要辩护,因此标准中有什么内容吗?
    • 是的。 C99 标准的“6.7.2.1 结构和联合说明符”部分的第 12 段说“结构或联合对象的每个非位字段成员都以适合其类型的实现定义的方式对齐。”不同的编译器,或不同处理器类型上的编译器,可能会以不同的方式对齐项目。
    【解决方案2】:

    填充由实现决定,我们指的是您用于编译代码的特定编译器。

    在某些平台上,对于将使用什么填充有约定的约定。这就是使不同编译器编译的代码可以进行二进制互操作的原因。

    因此,虽然理论上不同的编译器可以做出不同的选择,但只要所有代码都在单个进程中运行,不同的填充规则很少会成为问题。另一方面,如果您决定对通过网络发送的数据使用struct 布局,那么您总是会遇到问题。不要将二进制布局结构用于传输线上的数据。

    【讨论】:

    • 这里的“平台”既指指令集架构(32 位 x86、64 位 x86、32 位 ARM、32 位 Power、64 位 Power 等),也可能指对操作系统而言,尽管对于相同指令集架构的不同操作系统很可能使用相同的对齐规则。
    最近更新 更多