命名空间
变体
操作

std::align

来自 cppreference.cn
< cpp‎ | memory
 
 
内存管理库
(仅为说明目的*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
内存资源
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化存储
(直到 C++20*)
(直到 C++20*)
显式生命周期管理
 
定义于头文件 <memory>
void* align( std::size_t alignment,

             std::size_t size,
             void*& ptr,

             std::size_t& space );
(自 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 中弃用)
定义适合用作给定大小类型的未初始化存储的类型
(类模板) [编辑]
通知编译器指针已对齐
(函数模板) [编辑]