c++ 内存对齐详解

一、理论部分

        1.结构体第一个的偏移量为0,之后的每一个偏移量要从自身的整数倍开始

        2.如果结构体没有设定对齐字节数,则最大成员为对齐字节数,如有设置,则最大字节数为

        min(最大成员,设定的对齐字节)

二、实验

注意,结构体里面的变量顺序,会影响占用空间

struct A{
    char c; // 1
};
int main(){
 
    cout<<sizeof(A)<<endl; // 输出1
    return 0;
}
struct A{
    char c; // 1
    short st; // 2
};
int main(){
 
    cout<<sizeof(A)<<endl; // 4
    return 0;
}

这里为4的原因是内存对齐(2+2)

struct A{
    char c; // 1
    short st; // 2
    int i; // 4
};
int main(){
 
    cout<<sizeof(A)<<endl; // 8
    return 0;
}

这里为8的原因是之前的内存为4不变,这里又加入了4个字节,4+4=8,注意这里不能按全部变为4个字节,总共12字节理解。可以按从上往下顺序执行理解

struct A{
     int i; // 4
    char c; // 1
    short st; // 2
};
int main(){
 
    cout<<sizeof(A)<<endl; // 8
    return 0;
}

这里换了顺序还是不影响,也为8,可以理解为前面占了4个格子,后面第二排占一个格子,还有3个格子,取两个格子可以给short ,总共8字节(8个格子)

struct A{
    char c; // 1
    short st; // 2
    int i; // 4
    char c2; //1
};
int main(){
 
    cout<<sizeof(A)<<endl; // 12
    return 0;
}

这里前面三排占了8个格子,后面只能取4个格子,占一个格子,8+4

struct A{
    char c2 ;//1
    char c; // 1
    short st; // 2
    int i; // 4
};
int main(){
 
    cout<<sizeof(A)<<endl; // 8
    return 0;
}

这里换了位置,为什么不一样了呢?

是因为从前往后看,1+1+2=4 刚好和int对齐,所以只用8个字节。但是这里在加一个char也会为12,如下:

struct A{
    char c2 ;//1
    char c3 ;//1
    char c; // 1
    short st; // 2
    int i; // 4
};
int main(){
 
    cout<<sizeof(A)<<endl; // 12
    return 0;
}
struct A{
   
    char c; // 1
    short st; // 2
    int i; // 4
    long l; // 8
};
int main(){
 
    cout<<sizeof(A)<<endl; // 16
    return 0;
}

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值