结构体所占内存大小(字节对齐问题)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言中结构体占用内存大小的问题
2014-04-22 10:55 Deng_Ran | 分类:C/C++ | 浏览381次
struct stOne // 结构体1
{
char c1;
int i1;
char c2;
int i2;
};
struct stTwo // 结构体2
{
char c1;
char c2;
int i1;
int i2;
};
各位大侠,上面两个结构体因为硬件的边界调整原则,占用内存大小并不相同。在我的电脑上,sizeof(struct stOne)是16,sizeof(struct stTwo)是12。
小弟有一疑问,会不会存在一种情况:
struct stOne stA, stB; // 定义两个结构体
这两个结构体大小并不相同,即同一类型结构体能否占用不同内存大小?
分享到:
2014-04-22 11:01 提问者采纳
你好,struct stOne stA, stB; // 定义两个结构体
这两个结构体大小完全相同!!
追问
谢谢大侠回复,小弟还有一问题请教:
struct stOne
{
char c1;
int i1;
char c2;
};
char类型变量的边界是1,int类型变量的边界是4,那么,我感觉这个结构体的大小是1 + (3) + 4 + 1 = 9,但实际上占用的内存是12?
回答
是的,最后的大小就类似于一个由几根木板组成的长方形,也许每根的长度都不一样,但是都要按照最长的那根那样存放,所以占用内存= 最长的那根 X 根数
有3个变量所以 4*3 =12
其他3条回答
2014-04-22 11:03 阳顶天鹿鼎记 | 七级
不会,同一个结构体占用的内存都是一样的,
stOne和stTwo之所以不同,是因为内存对齐问题。
取内存时,是按照主机系统是多少位来取的
32位系统,每次取四个字节
64位系统,每次取8个字节
根据你sizeof得到的结果,你的系统是32位的,所以每次取四个字节,而stOne char类型占用一个,而int占用四个,所以char类型自动占用了4个,否则,如果char占用一个,取得时候,去了一个char,然后去了int变量的前三个,这样会出问题,所以,会得到你上面sizeof的结果
stTwo,就不会因为是两个char类型挨着的,这样两个char类型占用四个,取得时候先取两个char,再取int。
评论 | 3 0
2014-04-22 11:04 冰血无双 | 七级
不会不同,自己查一下数据补齐、数据对齐,还有内存页的概念
评论 | 1 0
2014-04-22 11:05 ylx2193395 | 三级
这是因为字节对齐原则,在Linux下其是按2字节对齐,可是在VC++下默认是按8字节对齐,必须满足4的整数倍。这样有助于存储效率。第一个char 为1字节,int为4字节,由于8字节对齐原则系统会预留出3个字节,保证8个字节对齐。而第二个两个char 2个字节,1个int4字节,系统补充2个字节后,此时8个字节,再加一个Int为12.满足条件