std::align
来自cppreference.com
定义于头文件 <memory>
|
||
void* align( std::size_t alignment, std::size_t size, |
(C++11 起) | |
给定指针 ptr
指定大小为 space
的缓冲区,返回按指定 alignment
为 size
字节数对齐的指针,并减小 space
参数对齐所用的字节数。返回首个对齐的地址。
仅以给定对齐量对齐入缓冲区的所需字节数合适,函数才会修改指针。若缓冲区太小,则函数不做任何事并返回 nullptr 。
若 alignment
不是二的幂,则行为未定义。
参数
alignment | - | 欲求的对齐量 |
size | - | 要被对齐的存储的大小 |
ptr | - | 指向至少有 space 字节的连续存储的指针
|
space | - | 要在其中操作的缓冲区的大小 |
返回值
ptr
的调整值,或若提供空间太小则为空指针值。
示例
演示使用 std::align 在内存中放置不同类型的对象
运行此代码
#include <iostream> #include <memory> template <std::size_t N> struct MyAllocator { char data[N]; void* p; std::size_t sz; MyAllocator() : p(data), sz(N) {} template <typename T> T* aligned_alloc(std::size_t a = alignof(T)) { if (std::align(a, sizeof(T), p, sz)) { T* result = reinterpret_cast<T*>(p); p = (char*)p + sizeof(T); sz -= sizeof(T); return result; } return nullptr; } }; int main() { MyAllocator<64> a; // 分配一个 char char* p1 = a.aligned_alloc<char>(); if (p1) *p1 = 'a'; std::cout << "allocated a char at " << (void*)p1 << '\n'; // 分配一个 int int* p2 = a.aligned_alloc<int>(); if (p2) *p2 = 1; std::cout << "allocated an int at " << (void*)p2 << '\n'; // 分配一个 int ,对齐于 32 字节边界 int* p3 = a.aligned_alloc<int>(32); if (p3) *p3 = 2; std::cout << "allocated an int at " << (void*)p3 << " (32 byte alignment)\n"; }
可能的输出:
allocated a char at 0x2ff21a08 allocated an int at 0x2ff21a0c allocated an int at 0x2ff21a20 (32 byte alignment)
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2377 | C++11 | 要求 alignment 为基础或受支持的扩展对齐值
|
仅需要为二的幂 |
参阅
alignof 运算符 | 查询类型的对齐要求 (C++11 起) |
alignas 说明符 | 指定该变量的存储应该按指定量对齐 (C++11) |
(C++11) |
定义适于用作给定大小的类型的未初始化存储的类型 (类模板) |