了解 C 中的内存对齐约束和填充字节

Sur*_*ati 4 c struct sizeof padding

我有以下代码片段。

#include<stdio.h>
int main(){
    typedef struct{
        int a;
        int b;
        int c;
        char ch1;
        int d;
    } str;
    printf("Size: %d \n",sizeof(str));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出如下

Size: 20
Run Code Online (Sandbox Code Playgroud)

我知道 的大小structure大于 的组件大小的总和,structure因为添加了填充以满足内存对齐约束。我想知道如何决定必须添加多少字节的填充。它取决于什么?它取决于 CPU 架构吗?它也取决于编译器吗?我在这里使用 64 位 CPU 和gcc编译器。如果这些参数发生变化,输出将如何变化。

我知道 StackOverflow 上也有类似的问题,但他们没有彻底解释这种内存对齐约束。

ban*_*ace 5

它通常取决于体系结构的要求。还有的货物在这里,但它可以总结如下:

x86 或 ARM 处理器上基本 C 数据类型的存储通常不会从内存中的任意字节地址开始。相反,除了 char 之外的每种类型都有对齐要求;chars 可以从任何字节地址开始,但 2 字节 short 必须从偶地址开始,4 字节 int 或浮点必须从可被 4 整除的地址开始,8 字节 long 或 double 必须从可被 8 整除的地址开始. 签名或未签名没有区别。

在您的情况下,可能会发生以下情况: sizeof(str) = 4 (4 bytes for int) + 4 (4 bytes for int) + 1 ( 1 byte for char) + 7 (3 bytes padding + 4 bytes for int) = 20

填充在那里,因此它int位于 4 个字节的倍数的地址处。此要求来自int4 个字节长的事实(我对您使用的架构的假设)。但这会因一种架构而异。