下面是代码片段。
#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;
}它提供的输出如下
Size: 20我知道structure的大小大于structure组件大小的总和,因为填充是为了满足记忆对齐约束而添加的。我想知道如何决定要添加多少字节的填充。这取决于什么?它取决于CPU架构吗?它也取决于编译器吗?我在这里使用64位CPU和gcc编译器。如果这些参数发生变化,输出将如何变化。
我知道StackOverflow上也有类似的问题,但它们并没有彻底解释这种内存对齐约束。
发布于 2015-05-26 15:03:21
它一般取决于体系结构的需求。这里上有负载,但可以总结如下:
x86或ARM处理器上的基本C数据类型的存储通常不会从内存中的任意字节地址开始。相反,除char以外的每种类型都有对齐的要求;字符可以在任何字节地址上开始,但是2字节的短路必须从偶数地址开始,4字节的ints或浮动必须从可被4除的地址开始,8字节的长或双必须从可被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字节的多个地址上。这一需求来自于这样一个事实:int有4个字节长(我对您正在使用的体系结构的假设)。但这将因建筑而异。
发布于 2015-05-26 15:07:41
这取决于什么?它取决于CPU架构吗?它也取决于编译器吗?
至少CPU、操作系统和编译器。
发布于 2015-05-26 15:02:20
我知道它取决于CPU架构,我认为您可以在网上找到一些有趣的文章来讨论这个问题,维基百科在我看来还不错。
对我来说,我使用的是64位linux机器,我可以说的是,每个字段都是对齐的,因此它位于一个内存地址上(对于基本类型),内存地址可以被其大小整除,例如:
int和float由4对齐(必须位于可被4整除的内存入口中)
char和bool 1(这意味着没有填充)
double和pointers按8对齐
避免填充的最佳方法是将字段从最大到最小(当只有基本字段时)。
当有组合字段时,我在这里更难解释,但我认为您可以自己在一篇论文中找到它。
https://stackoverflow.com/questions/30461997
复制相似问题