内存对齐能够用一句话来概括:“数据项仅仅能存储在地址是数据项大小的整数倍的内存位置上”

对齐原因

1、平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常  2、性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问  

正确处理字节对齐

1、对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:  2、数组:按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了  3、联合:按其包含的长度最大的数据类型对齐  4、结构体:结构体中每个数据类型都要对齐  
#include <stdio.h>  //测试struct对齐 struct stu1{      char sex;     int length;     char name[10]; }stu;  int main(int argc, char** argv) {     printf("%ld/n%ld/n%ld/n%ld/n",sizeof(stu.sex),sizeof(stu.length),sizeof(stu.name),sizeof(stu));     return 0; }  ./struct 1 4 10 20  在x86下,GCC默认4字节对齐,且在struct中每个成员都要对齐,所以char类型的sex会填充3个字节,char数组的name会填充2个字节,所以sizeof(stu)的长度是20字节 

struct成员对齐深入研究


#include <stdio.h> #pragma pack (4) struct stu1{ char sex; int length; char name[10]; char intro[3]; unsigned long age; int jj; char a; char b; char c; char d; char e; int aaa; }stu; int main(int argc, char** argv) { printf("%ld/n%ld/n%ld/n%ld/n%ld/n%ld/n",sizeof(stu.sex),sizeof(stu.length),sizeof(stu.name),sizeof(stu.age),sizeof(stu.jj),sizeof(stu)); return 0; } 1 4 10 8 4 48 看了一些文章打算结构体成员顺序来分析内存分配的,这里简单总结一句话:连续的类型相同的成员会合并后对齐,例如五个连续的char占用5个字节,对齐后占用8个字节。

各标准数据类型对齐大小


32位编译器:32位系统下指针占用4字节 char :1个字节 char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器) short int : 2个字节 int: 4个字节 unsigned int : 4个字节 float: 4个字节 double: 8个字节 long: 4个字节 long long: 8个字节 unsigned long: 4个字节 64位编译器:64位系统下指针占用8字节 char :1个字节 char*(即指针变量): 8个字节 short int : 2个字节 int: 4个字节 unsigned int : 4个字节 float: 4个字节 double: 8个字节 long: 8个字节 long long: 8个字节 unsigned long: 8个字节 引用自:http://blog.csdn.net/u010510962/article/details/51039094

发表评论

电子邮件地址不会被公开。 必填项已用*标注