C++内存对齐

本文详细探讨了C++中的内存对齐原则,包括结构体数据成员的存储规则、空类和静态成员的影响、内置类型数据成员的排列以及虚函数和继承的情况。内存对齐对于提高效率和跨平台兼容性至关重要。同时,文章指出不能直接使用memcmp函数比较结构体,因为内存对齐可能导致填充字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

内存对齐的基本原则:

  1. 结构(struct/class)的内置类型数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的起始位置要从自身大小的整数倍开始存储(特别注意64位机器的指针大小为8个字节)。
  2. 如果一个结构A里有结构体成员B,则结构体B要从其内部"最宽基本类型成员”的整数倍地址开始存储(如struct a里存有struct b,b里有char, int, double等元素,那b应该从8的整数倍位置开始存储)。
  3. 结构体的总大小为结构体的有效对齐值的整数倍,结构体的有效对齐值的确定:
    1. 当未明确指定时,以结构体或结构体所包含结构体成员中最长的成员长度为其有效值。
    2. 当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。
    3. 当用__attribute__ ((packed))指定长度时,强制按照此值为结构体的有效对齐值。
    4. 不管# pragma pack和__attribute__如何指定,结构体内部成员的自对齐仍然按照其自身的对齐值。
  4. union以结构里面size最大元素为union的size,因为在某一时刻,union只有一个成员真正存储于该地址

空类/静态成员

程序 1

class A{
   
};

int main() {
   
	cout << sizeof(A) << endl;	// 1
}

对于一个什么都没有的空类,实际并不是空的,因为有默认的函数,具体可以参考 (待填入网址),大小是 1,这是因为需要有一个地址,C++ 不允许两个不同的对象有相同的地址,所以 C++ 中空的类和结构体大小都是 1

程序 2

class A{
   
	A(){
   }
	~A(){
   }
	void print() {
    printf("print()\n"); }
	void foo() {
    printf("print()\n"); }

	static void sprint() {
    printf("sprint()\n"); }
};

int main
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值