C++结构体内存对齐

介绍

结构体的大小并不是简单地将每个结构体成员的大小相加就能得到。

cpu一次能读取多少内存要看数据总线是多少位,如果是16位,则一次只能读取2个字节,如果是32位,则可以读取4个字节,并且cpu不能跨内存区间访问。

三个原则:
1、第一个成员的首地址为0.
2、每个成员的首地址是自身大小的整数倍
3、结构体的总大小,为其成员中所含最大类型的整数倍

对齐数

对齐数 = 该结构体成员变量自身的大小与编译器默认的一个对齐数的较小值。

在这里插入图片描述

顺序问题

结构体成员变量的顺序不同,可能会造成内存不必要的损失。将占用空间小的成员尽量集中在一起,可以有效地避免内存不必要的浪费。

结构体有效对齐数计算

结构体对齐数 == min{成员最大对齐数, 编译器默认对齐数}

可以通过调用C++标准库 alignof 函数来获取结构体的默认对齐数。alignof 函数将返回以字节为单位的给定类型的对齐要求。

#include <iostream>

struct MyStruct {
    int a;
    char b;
    double c;
};

int main() {
    std::cout << alignof(MyStruct) << std::endl;  // 输出结构体的默认对齐数8
    return 0;
}

数组对齐

数组在内存中存储时是分开存储的,char类型的数组每个元素是 1Byte,内存对齐时按照单个元素进行对齐。

结构体内存对齐(如何计算结构体的大小)
如何理解 struct 的内存对齐?
C语言 | 关于结构体内存对齐,看这篇就够了
C/C++中内存对齐问题的一些理解

C++结构体与数组的数据转换-上(内存对齐)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值