关于边界对齐的问题
2015-10-12 10:37
211 查看
边界对齐是什么?就是某种数据类型的存储地址有一定要求。对于计算机而言,理论上每个字节都可以用来存储数据,但是有些CPU或者由于什么其他原因,它们在读取数据时是按照对齐的方式来读取的。比如说,对于int型而言,intel默认是按照4字节的对齐要求来读取的。这样的读取可以在一个周期内完成。而如果不是这样的,那么可能需要2个周期或者更多时间来完成一个数据的读取。
这也就解释了为啥需要边界对齐。但是我们在写C程序时,并没有考虑边界对齐的问题,那么这部分工作是谁做的?答案是编译器,边界对齐的工作,由编译器自动完成。
边界对齐的要点是什么?
简单的说,对于int型而言,起始地址为4的倍数;对于char类型而言,起始地址为任意字节皆可;对于short类型而言,起始地址为2的倍数;对于结构体而言,对齐方式为结构体内类型最大的字节量;对于联合体而言,对齐方式要与内部元素的最大对齐字节数一致。
举例如下:
struct ex1 {
char e1;
int e2;
short e3;
};//size:12
union ex2
{
char a;
int b;
double c;
struct d { int x; int y; int z; };
};//size:8
这也就解释了为啥需要边界对齐。但是我们在写C程序时,并没有考虑边界对齐的问题,那么这部分工作是谁做的?答案是编译器,边界对齐的工作,由编译器自动完成。
边界对齐的要点是什么?
简单的说,对于int型而言,起始地址为4的倍数;对于char类型而言,起始地址为任意字节皆可;对于short类型而言,起始地址为2的倍数;对于结构体而言,对齐方式为结构体内类型最大的字节量;对于联合体而言,对齐方式要与内部元素的最大对齐字节数一致。
举例如下:
struct ex1 {
char e1;
int e2;
short e3;
};//size:12
union ex2
{
char a;
int b;
double c;
struct d { int x; int y; int z; };
};//size:8
相关文章推荐
- web.xml配置文件
- web.xml配置文件
- 指向函数的指针1(c语言)
- 使用axis2访问webservice(webserivice基于.net平台实现)
- 新手可能不喜欢轻量级 Linux 发行版的几个原因
- The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods install
- Setting the Master Configuration on the Slave
- 机器学习/统计学方法/算法 —— 总体架构目录
- RESTful API 设计指南
- 看似简单!解读C#程序员最易犯的7大错误
- IOS枚举使用
- 面试笔试题
- 使用axis2访问webservice(webserivice基于.net平台实现)
- MySQL Workbench 修改快捷键
- js控制手机号码中间用星号代替
- 开源中国源码学习UI篇(二)之NavigationDrawer+Fragment的使用分析
- js中金融数字格式 js中字符串反转
- 值得关注的10个C语言开源项目
- 带有地图的Activity在截屏时地图空白,原来必须使用地图自带的截屏。
- php100 编程小技巧