博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
结构体对齐和补齐
阅读量:7165 次
发布时间:2019-06-29

本文共 1025 字,大约阅读时间需要 3 分钟。

对齐的原因

  • 现在各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int型(假设为 32位)如果存放在偶地址开始的地方,那么一个读周期就可以读出,而如果存放在奇地址开始的地方,就可能会需要2个读周期,并对两次读出的结果的高低 字节进行拼凑才能得到该int数据。显然在读取效率上下降很多。这也是空间和时间的博弈。
  • 数据对齐是为了读取数据的效率。假如说每一次 读取数据时都是一个字节一个字节读取,那就不需要对齐了,这跟读一个字节没有什 么区别,就是多读几次。但是这样读取数据效率不高。为了提高读取数据的带宽,现 代存储系统都采用许多并行的存储芯片来提高读取效率

 

例子:#include 
#pragma pack(push, 4)using namespace std;struct A{char a;long b;char c;double d;};//打乱顺序struct B{char a;char b;long c;double d;};int main(){ cout << sizeof(A) << endl; cout << sizeof(B) << endl; return 0;}

 

分析:

对于A:a占一个字节,long类型为4个字节,为了让之后的long b自然对齐,需要增加3个字节(下同), b占4个字节,c占1个字节,为了让double对齐,增加7字节,之后d占8个字节。所以 sizeof(A) = 1+3+4+1+7+8 = 24个字节。

对于B:同理,sizeof(B) = 1+1+2+4+8 = 16个字节

结构体数组补齐:

struct MemAlign{    char a[18]; // 18 bytes    double b; // 08 bytes    char c; // 01 bytes    int d; // 04 bytes    short e; // 02 bytes}MemAlign;

 

 

结构体MemAlign数组:

 

转载于:https://www.cnblogs.com/jonwei/articles/9589901.html

你可能感兴趣的文章