gpt4 book ai didi

C编程: padding in structure

转载 作者:太空宇宙 更新时间:2023-11-04 04:18:43 25 4
gpt4 key购买 nike

我正在使用

processor architecture: x86_64
OS : Debian GNU/Linux 9 (stretch) 64-bit
GCC compiler ver. : 6.3.0

如果我编译这段代码 -

struct test {char a; int b;}
test;
printf("%ld", sizeof(test);

然后输出是 - 8 我假设它是因为 4 字节填充,我的意思是 1+3+4现在我尝试了这段代码-

struct test{char a; double b;} 
test;

这给了我 16 个字节,然后我想,可能是因为 8 个字节的填充,即-当我尝试这段代码时现在是 1+7+8-

struct test{char a; long double b; char c;}
test;

这给了我 48 个字节

在我使用 gcc 的系统中,int = 4 字节,double = 8 字节,char = 1 字节,long double = 16 字节。

我的问题是这是如何运作的?为什么不统一填充?

最佳答案

你用你的第三个结构改变了模式。如果您改用第三种结构,您将获得与前两种结构一致的数字:

struct A { char a; int b; };         // 1 +  3 +  4 =  8
struct B { char a; double b; }; // 1 + 7 + 8 = 16
struct C { char a; long double b; }; // 1 + 15 + 16 = 32

现在,当您在 long double 之后放置另一个 char 时,您只需要再一个字节,但编译器会添加另一个15 个字节的填充:

struct D { char a; long double b; char c; }; // 1 + 15 + 16 + 1 + 15?!

我认为您真正想问的问题是,它为什么要这样做?它这样做是因为数组。 C 标准规定数组元素之间永远不能有任何填充。但是为了使内部填充保持 b 正确对齐到 16 字节,struct D 本身必须对齐到 16 字节。如果 struct D 的长度为 33 个字节,则数组 struct D dee[2] 的第二个元素将错位。因此,编译器必须在 struct D末尾插入更多填充,以使其大小为其对齐的倍数。

关于C编程: padding in structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48857036/

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