首先,我理解结构中的字节填充。但我仍然有一个小测试包含struct中的双字段,我不知道如何解释这个:
typedef struct {
char a;
double b;
}data;
typedef struct{
char a;
int b;
}single;
int main(){
printf("%d\n",sizeof(double));
printf("%d\n",sizeof(single));
printf("%d\n",sizeof(data));
}
通过此测试,答案为:8
8
和16
。
为什么这个结果让我思考?
通过第二次测试,我们可以看到我机器上的单词大小是4个字节。
通过第一次测试,我们可以看到double的大小是8个字节。
所以,在struct data
:结果应该是12个字节:char为4个字节,double为8个字节。
但是,我不知道为什么结果是16个字节。 (对我很奇怪)
请为我解释一下,谢谢:)
答案 0 :(得分:8)
这是十六个字节,因此如果你有一个data
的数组,double
值都可以在8字节边界上对齐。在内存中正确对齐数据可以在性能上产生很大的不同。未对齐的数据操作起来可能较慢,而且获取和存储的速度较慢。
答案 1 :(得分:4)
通常用于在结构中布局数据的过程基本上是这样的:
正如Earnest Friedman-Hill所说,最后一步是在结构的末尾添加填充,以便在它们的数组中,每个结构都以所需的对齐方式开始。
因此,对于struct { char c; double d; int32_t i; }
之类的结构,在典型的实现中,您有:
注意上述内容与机器的任何字大小无关。它仅使用每个成员的对齐要求。每种类型的对齐要求可能不同,并且可能与类型的大小不同,上述内容仍然有效。
(如果对齐要求不是2的幂,则算法会中断。可以通过使最后一步将偏移量增加到所有对齐的最小公倍数的倍数来解决。)
答案 2 :(得分:3)
你有什么奇怪的(或者我错过了什么)?
逻辑是相同的(填充是根据struct
中的“最大”原始字段(我的意思是 - int,double,char等)。
与single
一样,您有
1 (sizeof(char)) + 3 (padding) + 4 (sizeof(int))
data
中的情况相同:
1 (sizeof(char)) +
7 (padding, it's sizeof(double) - sizeof(char)) +
8 (sizeof(double))
这是16。
答案 3 :(得分:2)
编译器可能会将所有结构大小对齐为8的倍数
答案 4 :(得分:2)
除非使用编译器特定的指令明确指定它,否则对齐取决于编译器。
变量不一定是字对齐的。有时他们会为了效率而双字对齐。在浮点的特定情况下,它们可以对齐甚至更高的值,以便SSE可以工作。