结构体大小与sizeof

一个例子

#include <iostream>
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就退化为指针
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值