C++之字节对齐
参考:https://blog.csdn.net/hello_dear_you/article/details/123739899
#define _CRT_SECURE_NO_WARNINGS
// #pragma pack(1)
#include <iostream>
using namespace std;
class Person{
public:
int m_A; // 非静态的成员变量,属于对象身上
void func(){} // 非静态成员函数,不属于对象
static int m_B ; // 静态成员属性,也不属于对象
static void func1(){} // 静态的成员函数,也不属于对象
double m_C; // double类型 8个字节
};
void test01(){
cout << "Size of Person:" <<sizeof(Person)<<endl; // 输出 16 原因是字节对齐
// 空类的大小为1 每一个对象在内存中都有一个唯一的地址 char来维护这个地址
// char的大小就是1
}
int main(){
test01();
return 1;
}
运行结果: Size of Person: 16
为什么要进行字节对齐?
答:以牺牲空间的方式来减少时间的消耗。
结构体对齐的公式
- 以
#pragma pack(x)
中x
和结构体中占用空间最大的成员做比较,取两者的最小值为n
- 以
n
值与结构体每个成员比较,得出结果列表为`m[x]`` - 根据每个成员的大小依次向内存中填充数据,要求填充成员的起始地址减去结构体起始地址的差值可以整除
m[x]
,如不能整除则向后移动,直到可以整除再填充成员到内存中 - 当全部成员填充完毕后所占用的字节数若不能整除
n
,则扩充内存至可以整除n
为止
#pragma pack(4)// 编译器将按照n个字节对齐
struct data
{
int a; // 4 bytes
char b; // 4 bytes
int c; // 4 bytes
short d; // 4bytes
}; // 16 bytes
#pragma pack() // 编译器将取消自定义字节对齐方式
字节对齐看这篇就够了:https://cloud.tencent.com/developer/article/1631792
嵌套结构体字节对齐:https://www.cnblogs.com/yichi/p/9478004.html