C/C++ 字节对齐 和 类占用空间

本文详细介绍了64位系统中各种基本数据类型长度,包括char、short、int、long、longlong、float和double,并探讨了结构体和类的字节对齐规则。通过实例演示,解释了如何优化内存使用以减少填充。重点强调了在嵌入式开发中选择明确长度类型的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本数据类型长度

目前系统以64位居多,下面列出64位系统下的基本数据类型长度。

嵌入式开发或者其他对数据长度敏感的场景,建议使用int8_t / int16_t / int32_t等明确长度的类型。

数据类型长度/字节
char1
short2
int4
long8
long long8
float4
double8 (32位系统为4)
void*8
bool1

结构体/类 字节对齐

为了CPU高效访问数据,操作系统会对结构体/类等非基础数据类型进行字节对齐。
详细理论介绍可以去百度,网上一抓一大把。
简单来说就是一个短的基本类型和一个长的基本类型放在一个结构体里,短的类型后面后面会填充,以达到和长类型长度对齐。下面用例子来说明。

空 结构体/类

struct A {};

sizeof(A) =1 ,空结构体占用1字节空间,可以认为结构体最少需要1字节的存储空间。

单一类型 结构

struct A {
    char a;
};

sizeof(A) = 1

短类型+长类型 结构

1 + 2 = 4

struct A {
    char a; // 1bit + 1bit填充
    short b; // 2bit
};

在这里插入图片描述

1 + 2 + 4 = 8

struct A {
    char a; // 1bit + 1bit填充
    short b; // 2bit
    int c; // 4bit
};

在这里插入图片描述

1 + 4 = 8

struct A {
    char a;
    int c;
};

在这里插入图片描述

2 + 4 + 8 = 16

struct A {
    short b;
    int c;
    long d;
};

在这里插入图片描述

长类型+短类型 结构

8 + 4 + 1 = 16

struct A {
    long d;
    int c;
    char a;
};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kM3n2mMy-1634292495840)(:/23029a7718b0410387daae74b7367848)]

短类型 和 长类型交错

4+8+1 = 24

struct A {
    int c;
    long d;
    char a;
};

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RVYfvSvG-1634292495840)(:/4335817068cd46d481fc37fec8bfefa5)]

从这个图可以看出长短类型交错填充比较多,所以写代码时尽量让短类型放在一起,减少内存对齐导致的空白填充。

类 占用的空间

类占用的空间和上述结构体占用的空间类似。在C++中可以认为 struct 和 class 是一种东西,不同点在于 struct 成员默认为 public 属性,class 成员默认为 private 属性。

  • 空类长度为1字节

  • 仅 成员变量 和 虚函数 占用空间
    虚函数因为有指向虚函数表的指针,所以占用一个指针的空间,8字节(64位系统)。
    虚函数无论有多少个都只有一个虚函数表指针,所以始终占用8字节。

  • 成员函数 、静态变量和函数 不占空间

  • 类占用空间遵循字节对齐原则

无成员变量和虚函数

class A {
  public:
    A() {}
    ~A() {}
};

sizeof(A) = 1

有成员变量

class A {
  public:
    A() {}
    ~A() {}

    long a;  // 8bit
};

sizeof(A) = 8

仅虚函数

class A {
  public:
    A() {}
    virtual ~A() {}
};

sizeof(A)=8

虚函数和成员变量

class A {
  public:
    A() {}
    virtual ~A() {} // 8 bit

    long a;
};

sizeof(A)=16

多个虚函数 只占用8字节

class A {
  public:
    A() {}
    virtual ~A() {}    // 8bit
    virtual void a(){};
    virtual void b(){};
};

sizeof(A)=8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值