c++ 内存对齐

本文详细解释了内存对齐的基本规则,包括数据成员对齐、结构体内嵌结构体成员对齐及结构体整体对齐规则,并通过具体实例进行说明。此外还介绍了如何使用 #pragmapack 控制内存对齐。

这是原来研究内存对齐的时候在网上看到的一篇文章,希望对你有用,不过内存对齐你大概明白,对于简单的能计算就行,因为有的时候笔试会出这个。
1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
 int id; //[0]....[3]
 double weight; //[8].....[15]      原则1
 float height; //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2]; //[0],[1]
 int id; //[4]...[7]          原则1

 double score; //[8]....[15]    
 short grade; //[16],[17]        
 BB b; //[24]......[47]          原则2
}AA;

int main()
{
  AA a;
  cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
  return 0;
}

结果是

48 24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲#pragma pack().

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为

32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

明白了不?

### C++内存对齐的规则及其实现 #### 内存对齐的重要性 在 C++ 编程中,内存对齐是一个重要的概念。合理的内存对齐可以显著提升程序性能、减少内存碎片并增强数据访问效率[^3]。 #### 基本规则 C++内存对齐遵循以下几个基本原则: 1. **基本类型对齐**:每种基础数据类型的地址必须是对齐到其大小的整数倍上。例如,`int` 类型通常占用 4 字节,则它的起始地址应该是 4 的倍数[^1]。 2. **结构体内存对齐**:在一个 `struct` 或 `class` 中,各成员变量按照声明顺序依次排列,并满足各自的数据类型对齐需求。整个结构体的总大小通常是最大成员对齐值的整数倍。 3. **编译器默认对齐方式**:大多数情况下,编译器会选择一种默认的对齐策略(如 `_Alignas`),开发者也可以通过特定指令调整对齐方式。 #### 获取对齐方式的方法 C++ 提供了标准工具用于查询和设置对齐方式。其中,`alignof` 运算符能够返回指定类型的对齐要求(单位为字节数)。需要注意的是,该运算符仅适用于具体的类型而非全局对齐配置[^2]。 #### 示例代码展示 以下是关于如何定义带自定义对齐属性的对象及其验证过程的一个简单例子: ```cpp #include <iostream> #include <type_traits> // 定义具有特殊对齐要求的类 struct alignas(16) AlignedStruct { char c; int i; }; int main() { std::cout << "Alignment of char: " << alignof(char) << " bytes\n"; // 输出 1 byte std::cout << "Alignment of int: " << alignof(int) << " bytes\n"; // 可能输出 4 bytes (取决于平台) // 打印自定义对齐后的 struct 对齐情况 std::cout << "Size of AlignedStruct: " << sizeof(AlignedStruct) << " bytes\n"; std::cout << "Alignment of AlignedStruct: " << alignof(AlignedStruct) << " bytes\n"; return 0; } ``` 上述代码展示了如何使用 `alignas` 关键字强制设定对象的最小对齐边界,同时也演示了通过 `alignof` 查看不同类型实际所需对齐量的方式。 #### 不同架构下的影响 不同硬件架构对待未对齐访问的态度各异。某些处理器(如 ARM 和 SPARC)完全不允许未对齐操作;而另一些像 x86 则允许但会牺牲一定运行速度作为代价[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值