C++ 内存对齐、智能指针及操作符重载全解析
1. 内存对齐概述
在系统编程时,常常需要分配对齐内存,即地址能被特定对齐值整除的内存。普通内存分配得到的地址可以是任意值,但一些 API 和物理设备要求内存按特定的最小粒度分配。例如:
- 0x0ABCDEF123456789 是未对齐的地址。
- 0x0ABCDEF12345F000 是 4KB 对齐的地址。
1.1 对齐内存的分配方式
对齐内存可以通过以下三种方式分配:
- 全局分配
- 栈上分配
- 动态分配
1.2 全局分配对齐内存
使用 C++ 的 alignas() 说明符可以全局分配对齐内存,示例代码如下:
#include <iostream>
alignas(0x1000) int ptr[42];
int main()
{
std::cout << ptr << '\n';
}
// > g++ -std=c++17 scratchpad.cpp; ./a.out
// 0x560809897000
在这个例子中,一个大小为 42 的整数数组被全局分配, alignas() 说明符将数组对齐到 4KB 页面边界。输出的数组地址能被 4KB 页面整除(即前 12 位为零)。
超级会员免费看
订阅专栏 解锁全文
2043

被折叠的 条评论
为什么被折叠?



