C++内存对齐

本文详细介绍了在Linux环境下,不同数据类型所占用的内存大小,并深入探讨了结构体内的内存对齐规则。通过具体示例,展示了如何计算结构体的大小,以及如何使用pragmapack来设定对齐值。

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

此篇文章以以linux环境进行说明

数据类型占用的内存大小(字节数)int:4       char:1         float:4      double:8     short:2

 

1、struct内存对齐

按结构体内长度最大的类型对齐(这里只是用sizeof测试内存占用大小, 真正在内存申请空间的时候, 一整段内存一定是以4为最小单位对齐的)

struct T
{
        char a;
        char b;
        char c;
}; // sizeof(T) = 3

struct T
{
     char a;
     char b;
     char c;
     short d;
}// sizeof(T) = 6

若多个变量没有超过对齐边界, 则不需要补空,否则需要补空, 将超过边界的变量重新按对齐规则进行新的空间分配,示例如下:

struct T
{
        short a;           //2
        char b;            //1
        char c;            //1
//a,b,c 的字节总和刚好达到对齐, 所以不需要补空
        int d;             //4    
};     //sizeof(T) = 8
struct T
{
        char a;          //1
        char b;          //1 
        char c;          //1
// a+b+c=3, 虽然没有达到边界,但是需要对齐,所以需要一个补空白位
        int d;          //4
};     //sizeof(T) = 1(a)+1(b)+1(c)+1(补位)+4 = 8

利用pragma pack设定对齐的值

struct T
{
        int a;       //4
        char b;      //1
//补齐-3
        double  c;   //8
        char d;      //1
//补齐-7
};  sizeof(T) = 24
#pragma pack(4)
struct T
{
        int a;     //4
        char b;    //1
//补齐-3
        double c;  //8
        char d;    //1
//因为强按4对齐, 补齐-3
};  sizeof(T)=20

思考:根据变量定义顺序, 先定义的先对齐, 遇到更长的再对齐, 还是一开始就按最长的对齐了

struct T
{
        char a;
        short b;
        int c;
}//a,b,对齐,c ???
 //a,对齐,b,c ???

不解释 了~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值