一个例子
#include <iostream>
using namespace std;
struct A {
char a;
char b;
char c;
};
struct B {
int a;
char b;
short c;
};
struct C {
char b;
int a;
short c;
};
#pragma pack(push) //保存对齐状态
#pragma pack(2) //设定为2字节对齐
struct D {
char b;
int a;
short c;
};
#pragma pack(pop)//恢复对齐状态
int main(int argc, char const *argv[])
{
cout << "A:" << sizeof(A) << endl;
cout << "B:" << sizeof(B) << endl;
cout << "C:" << sizeof(C) << endl;
cout << "D:" << sizeof(D) << endl;
return 0;
}
字节对齐
原因:
- 简化了形成处理器和存储器之间的接口的硬件设计
- 提高存储器系统的性能
结构体的大小:
- 结构体中每个成员均需要对齐
- 结构体整体以结构体中占字节数最多的一个基本类型对齐(如double,对于结构体中嵌套结构体的情况,仅考虑嵌套结构体中的最大基本类型,数组类似)。
#pragma pack(n) 设定字节对齐:
编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:
- 如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式;
- 如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。
sizeof
- sizeof计算分配的空间大小
- sizeof是运算符,括号内的内容在编译过程中是不被编译的,而是被替代类型
- 数组做sizeof的参数不退化,传递给strlen就退化为指针