std::align
来自 cppreference.com
在头文件 <memory> 中定义 |
||
void* align( std::size_t alignment, std::size_t size, |
(自 C++11 起) | |
给定一个指向大小为 space 的缓冲区的指针 ptr,返回一个对 size 个字节对齐的指针,并按对齐使用的字节数减少 space 参数。返回第一个对齐地址。
如果能够将所需数量的对齐字节放入缓冲区,该函数仅修改指针。如果缓冲区太小,该函数什么也不做并返回 nullptr。
如果 alignment 不是 2 的幂,则行为未定义。
内容 |
[编辑] 参数
alignment | - | 所需对齐 |
size | - | 要对齐的存储空间的大小 |
ptr | - | 指向至少 space 字节的连续存储区(缓冲区)的指针 |
space | - | 操作缓冲区的大小 |
[编辑] 返回值
ptr 的调整值,如果提供的空间太小,则为 NULL 指针值。
[编辑] 示例
演示了使用 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; std::cout << "allocated a.data at " << (void*)a.data << " (" << sizeof a.data << " bytes)\n"; // allocate a char if (char* p = a.aligned_alloc<char>()) { *p = 'a'; std::cout << "allocated a char at " << (void*)p << '\n'; } // allocate an int if (int* p = a.aligned_alloc<int>()) { *p = 1; std::cout << "allocated an int at " << (void*)p << '\n'; } // allocate an int, aligned at 32-byte boundary if (int* p = a.aligned_alloc<int>(32)) { *p = 2; std::cout << "allocated an int at " << (void*)p << " (32 byte alignment)\n"; } }
可能的输出
allocated a.data at 0x7ffd0b331f80 (64 bytes) allocated a char at 0x7ffd0b331f80 allocated an int at 0x7ffd0b331f84 allocated an int at 0x7ffd0b331fa0 (32 byte alignment)
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布的行为 | 正确行为 |
---|---|---|---|
LWG 2377 | C++11 | alignment 要求为基本或支持的扩展对齐值 |
只需要是 2 的幂 |
[编辑] 另请参阅
alignof 运算符(C++11) |
查询类型的对齐要求 |
alignas 说明符(C++11) |
指定变量的存储空间应按特定量对齐 |
(C++11)(C++23 中已弃用) |
定义适合用作给定大小类型的未初始化存储的类型 (类模板) |
(C++20) |
通知编译器指针已对齐 (函数模板) |