命名空间
变体
操作

std::align

来自 cppreference.com
< cpp‎ | memory
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
通用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
基本字符串转换
(C++17)
(C++17)

 
动态内存管理
未初始化内存算法
受限未初始化内存算法
分配器
垃圾收集支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



 
在头文件 <memory> 中定义
void* align( std::size_t alignment,

             std::size_t size,
             void*& ptr,

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