结构体大小与sizeof

一个例子

#include 
using namespace std;

struct A {
    char a;
    char b;
    char c;
};

struct B {
    int a;
    char b;
    short c;
};

struct C {
    char b;
    int a;
    short c;
};

#pragma pack(push) //保存对齐状态
#pragma pack(2) //设定为2字节对齐
struct D {
    char b;
    int a;
    short c;
};
#pragma pack(pop)//恢复对齐状态

int main(int argc, char const *argv[])
{
    cout << "A:" << sizeof(A) << endl;
    cout << "B:" << sizeof(B) << endl;
    cout << "C:" << sizeof(C) << endl;
    cout << "D:" << sizeof(D) << endl;
    return 0;
}

字节对齐

原因:

  • 简化了形成处理器和存储器之间的接口的硬件设计
  • 提高存储器系统的性能

结构体的大小:

  • 结构体中每个成员均需要对齐
  • 结构体整体以结构体中占字节数最多的一个基本类型对齐(如double,对于结构体中嵌套结构体的情况,仅考虑嵌套结构体中的最大基本类型,数组类似)。

#pragma pack(n) 设定字节对齐

编译器中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:

  • 如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式;
  • 如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。

sizeof

  1. sizeof计算分配的空间大小
  2. sizeof是运算符,括号内的内容在编译过程中是不被编译的,而是被替代类型
  3. 数组做sizeof的参数不退化,传递给strlen就退化为指针

你可能感兴趣的:(C-C++)