C++字节对齐

系统让程序中的变量按字节对齐的目的:访问高效!字节是内存空间分配的最小单位,在程序中,我们定义的变量可以放在任何位置,但实际情况是访问特定类型变量的时候在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间排列,而不是顺序的一个接着一个排列。


准则:


        其实字节对齐的细节和具体编译器实现有关,但一般而言,满足以下五个:

    • 结构体变量的首地址能够被其最宽基本类型成员的大小所整除
    • 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节
    • 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果需要编译器会在最末一个成员之后加上填充字节
    • 结构体的整体长度与其中结构体成员无关,而是整个结构体(包括结构体成员内部)中最长数据类型的整数倍
    • 使用#pragma pack(n)规定程序中字节对齐大小


举例:


因为系统有可能是32位或64位,所以long,double类型字节长度有可能不同,32位系统是4字节,64位系统是8字节,测试系统64位,基本类型大小不再讨论,现在讨论结构体的字节对齐问题

class test{
private:
    char value1;                                                                                                              
};

int main(int argc, char *argv[])
{
    cout<<sizeof(class test)<<endl;
    return 0;
}

输出1,因为结构体大小是最宽基本类型成员大小的整数倍,最宽基本类型是char

class test{
private:
    char value1[3];                                                                                                           
};

int main(int argc, char *argv[])
{
    cout<<sizeof(class test)<<endl;
    return 0;
}
输出3,和上面举例同理

class test{
private:
    char value1[3];
    int value2;                                                                                                               
};

int main(int argc, char *argv[])
{
    cout<<sizeof(class test)<<endl;
    return 0;
}
输出8,因为结构体大小是最宽基本类型成员大小的整数倍,最宽基本类型是 int
class test_in
{
private:
    char value1;
    short value2;
};

class test{
private:
    char value1;
    test_in value2; 
};

int main(int argc, char *argv[])
{
    cout<<sizeof(class test_in)<<endl;                                                                                        
    cout<<sizeof(class test)<<endl;
    return 0;
}
输出4,6,正如第四条准则所说

注意:在sizeof(class)大小时,要注意是否有虚函数,如果有虚函数,判断大小时要考虑虚指针,虚指针的大小和系统的位数有关,64位系统是8字节,32位系统是4字节。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值