结构体的对齐方式必须是程序员所了解的,关于内存对齐方式的优点和部分知识可以参阅http://www.ibm.com/developerworks/library/pa-dalign/
结构体占用的存储空间(struct & sizeof)
概要:结构体所占用的空间只可能是 1,2,4,6,8.........
结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项
读者先了解下基本单个结构体的对齐原则
以下均为32位下的c/c++编译器
关于结构体的存储方式:
1:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类
型所占用的字节数的倍数
2:结构的总大小必须为占用空间最大的那个变量类型的空间的倍数。
Struct stu
{
};
Sizeof(struct stu); //1 空结构体也会被分配一个字节的空间
struct stu
{
char a;
char b;
char c;
};
sizeof(struct stu) ; //3
struct stu
{
char a;
int b;
char c;
};
sizeof(struct stu) ; //12
struct stu
{
char a;
char c;
int b;
};
sizeof(struct stu) ; //8
struct stu
{
char a;
double b;
int c;
}
sizeof(struct stu) ; //24
struct stu
{
char a;
int b;
double c;
}
sizeof(struct stu) ; //16
#pragma pack(push) //保存对齐方式
#pragma pack(n)
#pragma pack(pop) //恢复对齐方式
设定变量以n字节对齐方式,
n字节对齐是指变量存放的起始地址
的偏移量有两种情况:
第一:如果n大于等于该变量类型所占用的字节数,那么偏移量必须满足默认的对
齐方式。
第二:如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不是默
认对齐方式。
#pragma pack(4)
struct stu
{
char a;
double b;
int c;
}
sizeof(struct stu) ; //16 满足条件二 < n
Struct stu
{
char a;
short c;
};
Sizeof(struct stu); //4 满足条件一 n>= 但是还得结构的总大小必须为占用空间最大的
那个变量类型的空间的倍数。
struct stu
{
char a;
short b;
char c;
};
Sizeof(struct stu); //6
现在我们来介绍嵌套结构的内存对齐方式,
C/C++源码:
#include <iostream.h>
union a
{
int a_int1;
double a_double;
int a_int2;
}; // 8 字节
typedef struct
{
a a1;
char y;
} b; // 16
class c
{
int date; //8
b b1; //16
a a2; //8
};
int main(void)
{
printf("%d---%d---%d/n",sizeof(a),sizeof(b),sizeof(c));
return 0;
}
结构:8---16---32
计算方法: 将结构体内部的结构体全部拆分成单个数据元素,然后按上面的内存对齐方式计算即可。(注意union,不需拆分)
所以class c 拆分后:
class c
{
int date; //1个字节
union a a1; // 注意union 不需拆 8个字节,可等同double
char y; //1个字节
union a a2; //8个字节
}
所以其内存布局是(从低字节到高字节,padding代表填充字节)
char date union a a1 char y union a a2
4 + 4padding + 8 + 1 + 7padding + 8 = 32 个字节