码迷,mamicode.com
首页 > 编程语言 > 详细

C语言内存对齐

时间:2016-08-16 00:06:40      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:


C语言的内存对齐
什么是内存对齐?为什么要内存对齐?如何行内存对齐?
内存对齐是指:数据在内存里放的数据,不是紧密的放在一起,而是按照一定的规则存放。
为什么要内存对齐:在32的cpu上,每条指令可以读取32位(4个字节的值),内存对齐是为了保证一次指令可以读到一个完整的数据,减少数据的拼合耗费。如下举例:
struct A
{
char a;
int b;
}temp;
则temp在内存中的存储是第一种方式(只是为了举例说明,并非实际的内存):

|a | 空     |   b       |
--------------------
|   |  |  |  |  |  |  |  |
0  1  2 3 4  5 6  7 8

而不是第二种方式:

|a | b             |
-------------------------
|   |   |   |   |   |   |   |   |
0  1   2  3  4   5  6   7  8

第一种方式:取b的时候,一个指令周期就可以取的到b。而第二种方式,第一个指令取0-3位,但却只取了b的一部分。再要有一个指令周期才能要b全取出来,并且还要进行一些运算。
如何进行内存对其:
按照数据的占有字节数,以保证一个指令周期能取到这个数为目标进行对齐。
如:
struct AA
{
char a;
int b;
char c;
}

struct BB
{
char a;
char c;
int b;
}
根据上面的原则:sizeof(AA) = 12,sizeof(BB) = 8;无声中节约了4个自己的内存。
win32的C编译器默认是4字节对齐的。当然也可以通过预编译指令来配置这个对齐的字节数。
再举个例子:
struct CC
{
char a;
short b;
char c;
int d;
}
sizeof(CC) = ? 是8还是12?
答案是12.
内存分配如下:

|a |空| b   |c | 空     | d         |
-------------------------------------
|  |  |  |  |  |  |  |  |  |  |  |  |
0  1  2  3  4  5  6  7  8  9  0  1  2

而不是

|a | b     |c | d         |
------------------------------------
|   |   |   |   |   |   |   |   |   |   |   |  | 
0  1  2   3  4   5   6  7  8  9   0  1  2

C语言内存对齐

标签:

原文地址:http://www.cnblogs.com/yangshanzai/p/5774621.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!