关于C语言结构体对齐的学习
2013-01-19 10:28
330 查看
# include <stdio.h> struct X { int a; char b; int c; }; int main(void) { printf("%d\n",sizeof(struct X)); return 0; } # include <stdio.h> struct Y { int a; char b; int c; char d; }; int main(void) { printf("%d\n",sizeof(struct X)); return 0; }
这个代码会输出什么?
a) 9,10
b)12, 12
c)12, 16
答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。
但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。
转自 : http://coolshell.cn/articles/5761.html 感谢酷壳博客的辛勤奉献。
相关文章推荐
- 关于c语言结构体内存对齐有感
- 关于内存对齐的学习笔记
- C++类空间大小关于内存对齐的学习
- 关于内存对齐的学习笔记
- jvm关于内存管理和垃圾回收的学习总结
- 关于bond口的学习
- 关于13.56MHZ的RFID汇总研究学习
- 【Scikit-Learn 中文文档】监督学习:从高维观察预测输出变量 - 关于科学数据处理的统计学习教程 - scikit-learn 教程 | ApacheCN
- <yii 框架学习> <转> 关于yii数据库添加新字段之后model类的修改
- 写给Linux内核新手-关于Linux内核学习的误区(转载)
- 2015年北京的第一场雪-关于android学习的思考(84)
- Springboot学习笔记(六)关于jdbc的增删改查
- 黑马程序员————IOS学习笔记 第12篇 关于单例设计模式的认识
- 关于最近学习的一些方法总结
- php学习笔记 --- 关于字符串函数
- Linux学习-关于Linux文件所存放内容的意义
- 关于构造IOCTL命令的学习心得
- OC学习之道:关于Block的初级学习
- 关于android.mk文件的作用、语法和自动添加源文件的学习
- 关于java语言中容器的学习笔记