gpt4 book ai didi

c - 结构体和变量的大小

转载 作者:行者123 更新时间:2023-11-30 19:46:49 24 4
gpt4 key购买 nike

我在计算结构的大小时有点迷失

所以我们有结构:

struct AcronymNode{ 
struct AcronymNode* next;
char acronym[5];
double num_phrases;
struct The_Phrase* phrase_list;
} Dictionary;

我认为它是

next : 4bytes
acronym: 5bytes + 3
num_phrases: 8bytes
phraselist: 4bytes
=24 bytes

当我查看注释时,它说:32 字节 = 4 + 5 + 3 (对齐到字)+ 4(对齐 double )+ 8 + 4 + 4(将下一个结构对齐到 8 的倍数)双)

为什么我们要添加额外的 8 来对齐,因为它不会溢出,4 个位于 double 之前,4 个位于第二个结构之后

在更高效的结构中,它具有双优先,紧随 24 字节的结构

我也想检查一下这是否正确

structT{
int a;
char b[5];
float c;
char d[2];
};

尺寸是 4 + 5+3 + 4 + 4 = 20 吗?

最佳答案

如果内存访问延迟不是您关心的问题,您可以指示编译器以不同的对齐方式布局结构(而不​​是对机器最有效的对齐方式)。例如:

#pragma pack(1)
struct AcronymNode{
struct AcronymNode* next;
char acronym[5];
double num_phrases;
struct The_Phrase* phrase_list;
} Dictionary;
#pragma pack()

尽管“#pragma pack”不是 C 语言的正式组成部分,但大多数编译器都支持它。在上面的示例中,“#pragma pack(1)”指示编译器将结构打包在一字节边界上,从而有效地更改结构的布局,如您所描述的那样:

next : 4bytes
acronym: 5bytes + 3
num_phrases: 8bytes
phraselist: 4bytes
=24 bytes

然后,“#pragma pack()”将对齐方式返回到默认值。

.

'#pragma pack(1)' 通常用于定义不需要其他对齐方式的结构;例如,当“通过线路”将此类结构发送到另一个系统时。有线协议(protocol)通常经过打包,以便字段之间没有填充符。

关于c - 结构体和变量的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23124001/

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