结构体对齐和补齐

对齐的原因

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

例子:

#include <iostream>

#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数组:

猜你喜欢

转载自blog.csdn.net/jonWei/article/details/82323057