首页 > 解决方案 > 如何正确使用 std::align

问题描述

我认为std::align作为运行时地址计算来满足程序的进一步逻辑是否正确,即如果程序逻辑不考虑任何特定的对齐方式,那么使用它没有意义std::align吗?

使用 ofstd::align会影响代码生成吗?我的理解是否正确,与std::assume_alignedC++20 不同,std::align它不是对编译器的提示?

标签: c++c++11memory-alignment

解决方案


std::align是一个普通的自由函数。这不是编译器提示,不涉及魔法。它确实会影响代码生成,因为任何其他函数都可能影响代码生成,即它可能被内联、重新排序等,但不是以任何特定方式。

至于函数的作用和使用时间(cppreference):

给定一个指向大小空间缓冲区的指针 ptr,返回一个按指定对齐方式对齐的指针大小字节数,并通过用于对齐的字节数减少空间参数。返回第一个对齐的地址。

因此,它是运行时构造,它执行一些指针运算以返回可用于所需对齐的地址。想象一下,您想将 a 存储std::int64_t在某个内存地址,但您不知道它是否已经正确对齐(因为它位于分配给 的某个缓冲区的中间std::malloc),那么std::align您就是朋友。

这是 libstdcxx 的实现:

inline void*
align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept
{
  if (__space < __size)
    return nullptr;
  const auto __intptr = reinterpret_cast<uintptr_t>(__ptr);
  const auto __aligned = (__intptr - 1u + __align) & -__align;
  const auto __diff = __aligned - __intptr;
  if (__diff > (__space - __size))
    return nullptr;
  else
    {
      __space -= __diff;
      return __ptr = reinterpret_cast<void*>(__aligned);
    }
}

它用于例如std::monotonic_buffer_resource::do_allocate- 这正是该函数的用例。


推荐阅读