结构体字节对齐方式

内存对齐规则

  • 变量(结构体变量)的起始地址能够被其对齐值整除,结构体变量的对齐值为最宽的成员大小
  • 结构体每个成员相对于起始地址的偏移能够被其自身对齐值整除,如果不能则在前一个成员后面补充字节
  • 结构体总体大小能够被最宽的成员的大小整除,如不能则在后面补充字节

此外还有编译器的默认对齐值,一般默认对齐值为4(结构体的实际对齐值会取结构体对齐值和编译器默认对齐值中较小的那一个)。

内存对齐好的处

  • 为了减少使用的内存
  • 为了提升数据读取的效率
#include <iostream>
using namespace std;

struct A
{
    char c;
    short a;
    int i;    
}; 
int main()
{
    A c;
    cout<<alignof(c.a)<<endl;//获取字节对齐方式 
    cout<<sizeof(A)<<endl;
    return 0;
}
//8
#include <iostream>
using namespace std;

struct A
{
    char c;
    int i;
    short a;
}; 
int main()
{
    A c;
    cout<<alignof(c.a)<<endl;//获取字节对齐方式 
    cout<<sizeof(A)<<endl;
    return 0;
}
//12

double类型的数组(double类型为8字节对齐), 其在内存中所处的位置如下

  数组的首地址为2,根据原则1数组未对齐。若CPU每次从内存中为8字节整数倍的地址开始读入8字节的数据,则每次从未对齐的数组中读取一个成员都要进行两次读取操作,而从对齐的数组中读取则只需要一次读取操作,数组对齐时读取效率有较大提升

 

转载于:https://www.cnblogs.com/tianzeng/p/9038395.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值