内存对齐

对齐规则

  • 1 首先struct和class中的各类型数据成员的位置偏移量offset要内存对齐,规则是偏移量offset必须是min(#paragma pack(n), 该数据成员所占字节数)的倍数
  • 2 其次,struct和class本身也要内存对齐,struct和class本身所占字节数必须是min(#paragma pack(n), 类内最长数据成员所占字节数)的倍数

例子

#include<iostream> 
using namespace std; 


class A{ 
private: 
    int a; 
    char b; 
    char c; 
}; 

class B{ 
private: 
    char b;//offset=0,是min(#paragma pack(4),1)=1的倍数,占索引[0] 
    int a; //offset=1,不是min(#paragma pack(4),4)=4的倍数,因此这里offset要为4才行,前面char要内存补齐,char占索引[0,1,2,3],int占索引[4,5,6,7] 
    char c;//offset=8,是min(#paragma pack(4),1)=1的倍数,char占索引[8] 
    //各个类型的数据成员内存对齐后,所占字节数为9,然后class本身也要内存对齐, 
    //因为9不是是min(#paragma pack(4),4)=4的倍数,因此这里class需要填补3个字节数,最终内存对齐字节数sizeof(B)=12,char占索引[8,9,10,11] 
}; 

class C{ 
private: 
    char b; 
    char c; 
    int a; 
}; 

class D{ 
private: 
    short b;//offset=0,是min(#paragma pack(4),2)=2的倍数,占索引[0,1] 
    char c;//offset=2,是min(#paragma pack(4),1)=1的倍数,占索引[2] 
    int a;//offset=3,不是min(#paragma pack(4),4)=4的倍数,因此这里offset要为4才行,前面char要内存补齐,char占索引[2,3],int占索引[4,5,6,7] 
    //各个类型的数据成员内存对齐后,所占字节数为8,然后class本身也要内存对齐, 
    //因为8是min(#paragma pack(4),4)=4的倍数,因此这里class不需要填补,最终内存对齐字节数sizeof(D)=8 
}; 

class E{ 
private: 
    short b;//offset=0,是min(#paragma pack(4),2)=2的倍数,占索引[0,1] 
    int a;//offset=2,不是min(#paragma pack(4),4)=4的倍数,因此这里offset要为4才行,前面short要内存补齐,short占索引[0,1,2,3],int占索引[4,5,6,7] 
    char c;//offset=8,是min(#paragma pack(4),1)=1的倍数,占索引[8] 
    //各个类型的数据成员内存对齐后,所占字节数为9,然后class本身也要内存对齐, 
    //因为9不是是min(#paragma pack(4),4)=4的倍数,因此这里class需要填补3个字节数,最终内存对齐字节数sizeof(E)=12,char占索引[8,9,10,11] 
}; 

class F{ 
private: 
    int a; 
    short b; 
    char c; 
}; 


int main(){ 
    cout << "sizeof(A)= " << sizeof(A) << endl;     //8
    cout << "sizeof(B)= " << sizeof(B) << endl;     //12
    cout << "sizeof(C)= " << sizeof(C) << endl;     //8
    cout << "sizeof(D)= " << sizeof(D) << endl;     //8
    cout << "sizeof(E)= " << sizeof(E) << endl;     //12
    cout << "sizeof(F)= " << sizeof(F) << endl;     //8
    return 0; 
}

输出为:

sizeof(A)= 8
sizeof(B)= 12
sizeof(C)= 8
sizeof(D)= 8
sizeof(E)= 12
sizeof(F)= 8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值