C语言内存对齐

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

时间: 2024-12-15 01:59:13

C语言内存对齐的相关文章

C语言内存对齐对则

这篇文章讲的非常好  :  http://blog.csdn.net/hairetz/article/details/4084088 用空间换时间, 规则 : 每个数据成员存储的起始位置都要是它的整数被或者它子成员的整数倍,  并且结构体总长度是它内部最大成员的整数倍, 不足补齐. #include<stdio.h> typedef struct a{ int id; //[0]...[3] double height; //[8]...[15] char name[10]; //[20]..

c语言内存对齐(1)

在<C陷阱与缺陷>有这样一个例子: 1 #include <stdio.h> 2 int 3 main(void) 4 { 5 int i; 6 char c; 7 for(i=0;i<5;i++){ 8 scanf("%d",&c); 9 printf("%d ",i); 10 } 11 printf("\n"); 12 return 0; 13 } 这个例子是讲printf和scanf函数接受函数应注意的

C语言 结构体的内存对齐问题与位域

http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对 齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽 松).这种强制的要求一来简化了处

C语言中内存对齐

今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个字节,一个char类型一个字节,怎么这个结构体的大小不是五个字节呢??上网查了一下,结果发现还有个内存对齐的问题. 为了方便操作系统访问内存,一次访问四个字节,为了避免一个变量的二次访问,通常设置采用内存对齐. 1 #include<stdio.h> 2 3 typedef struct 4 {

解析C语言结构体对齐(内存对齐问题)

C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久.其实相关的文章很多,感觉说清楚的不多.结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1.数据成员对齐规则:结构(struct或

c语言中内存对齐问题

在最近的项目中,我们涉及到了“内存对齐”技术.对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”.“内存对齐”应该是编译器的“管辖范围”.编译器为程序中的每个“数据单元”安排在适当的位置上.但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”.如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了. 一.内存对齐的原因 大部分的参考资料都是如是说的: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能在某些地址处取某些特定类

C语言再学习之内存对齐

昨天看Q3的代码,看到有个_INTSAIZEOF的宏,着实晕了一阵.一番google后,终于明白,这个宏的作用是求出变量占用内存空间的大小,先看看_INTSAIZEOF的定义吧: #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) (ANSI C标准下,_INTSAIZEOF宏定义在stdarg.h中,Q3中定义在bg_lib.h中:bg_lib.h -- standard C library

从硬件到语言,详解C++的内存对齐(memory alignment)

转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9099603.html 很多写C/C++的人都知道"内存对齐"的概念以及规则,但不一定对他有很深入的了解.这篇文章试着从硬件到C++语言.更彻底地讲一下C++的内存对齐. 什么是内存对齐(memory alignment) 首先,什么是内存对齐(memory alignment)?这个是从硬件层面出现的概念.大家都知道,可执行程序是由一系列CPU指令构成的.CPU

C语言中的内存对齐

由下面的测试代码可以总结出两点:(1)内存对齐是针对结构体而言的    (2)编译时char类型的申请的空间由其后面的数据类型决定. #include<stdio.h> enum Season { Spring,Summer,Autumn }; enum ENUM Enum = Autumn; union UNION { int a; char b; double c; }; union UNION Union; struct STRUCT { char b; //4字节 int a; //4