std::align
来自 cppreference.cn
定义于头文件 <memory> |
||
void* align( std::size_t alignment, std::size_t size, |
(自 C++11) | |
给定指向大小为 space 的缓冲区的指针 ptr,返回按指定的 alignment 对齐的指针,用于 size 个字节,并将 space 参数减少用于对齐的字节数。返回第一个对齐的地址。
仅当可以将所需数量的字节按给定的对齐方式放入缓冲区时,该函数才会修改指针。如果缓冲区太小,则该函数不执行任何操作并返回 nullptr。
如果 alignment 不是 2 的幂,则行为未定义。
内容 |
[编辑] 参数
alignment | - | 期望的对齐方式 |
size | - | 要对齐的存储大小 |
ptr | - | 指向至少 space 字节的连续存储(缓冲区)的指针 |
space | - | 操作的缓冲区大小 |
[编辑] 返回值
ptr
的调整值,如果提供的空间太小,则为 null 指针值。
[编辑] 示例
演示如何使用 std::align
在内存中放置不同类型的对象。
运行此代码
#include <iostream> #include <memory> #include <new> template<std::size_t N> struct MyAllocator { std::byte data[N]; std::size_t sz{N}; void* p; MyAllocator() : p(data) {} // Note: only well-defined for implicit-lifetime types template<typename T> T* implicit_aligned_alloc(std::size_t a = alignof(T)) { if (std::align(a, sizeof(T), p, sz)) { T* result = std::launder(reinterpret_cast<T*>(p)); p = static_cast<std::byte*>(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.implicit_aligned_alloc<char>()) { *p = 'a'; std::cout << "allocated a char at " << (void*)p << '\n'; } // Allocate an int if (int* p = a.implicit_aligned_alloc<int>()) { *p = 1; std::cout << "allocated an int at " << (void*)p << '\n'; } // Allocate an int, aligned at a 32-byte boundary if (int* p = a.implicit_aligned_alloc<int>(32)) { *p = 2; std::cout << "allocated an int at " << (void*)p << " (32-byte alignment)\n"; } }
可能的输出
allocated a.data at 0x7ffc654e8530 (64 bytes) allocated a char at 0x7ffc654e8530 allocated an int at 0x7ffc654e8534 allocated an int at 0x7ffc654e8540 (32-byte alignment)
[编辑] 缺陷报告
以下行为变更缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确的行为 |
---|---|---|---|
LWG 2377 | C++11 | alignment 需要是基本或受支持的扩展对齐值 |
只需要是 2 的幂 |
[编辑] 参见
alignof (C++11) |
查询类型的对齐要求 (运算符) |
alignas (C++11) |
指定变量的存储应按特定量对齐 (说明符) |
(自 C++11)(在 C++23 中弃用) |
定义适合用作给定大小类型的未初始化存储的类型 (类模板) |
(C++20) |
通知编译器指针已对齐 (函数模板) |