C++ 11引入了 alignas specifier来指定变量的对齐方式,并引入 alignof operator来查询类型的默认对齐方式。但是,我看不到任何方法来获取特定变量的对齐方式。让我们举一个简单的例子:

alignas(16) float* array;

这是我们可以做的:
  • alignof(float*)返回8,这显然不是我们想要的。
  • alignof(array)返回16,这正是我们想要的,但这是编译器扩展;标准指定的alignof不能用于特定变量。
  • alignof(decltype(array))返回8,这是我们期望的,但不是我们想要的。
  • std::alignment_of 是根据alignof实现的,因此并没有太大帮助。

  • 我想要一种机制来确认特定变量array在16字节边界上对齐。标准中是否有任何内容可以执行这样的查询?

    最佳答案

    您可以尝试以下方法:

    bool is_aligned(const volatile void *p, std::size_t n)
    {
      return reinterpret_cast<std::uintptr_t>(p) % n == 0;
    }
    
    assert(is_aligned(array, 16));
    

    上面假设了一个平坦的地址空间,并且对uintptr_t的算术等效于对char *的算术。

    尽管这些条件在大多数现代平台上都普遍存在,但标准都不要求这两个条件。

    只要将void *转换回uintptr_t时可以反转转换,则实现完全有可能在将uintptr_t转换为void *时执行任何转换(请参见What is uintptr_t data type)。

    N4201中的更多详细信息(除其他事项外,它建议is_aligned()操作)。

    编辑



    它允许类似:
    alignas(16) volatile float a;
    
    assert(is_aligned(&a, 16));
    

    没有volatile,您会得到错误



    其他引用:
  • Why and when is cast to char volatile& needed?
  • Why is a point-to-volatile pointer, like "volatile int * p", useful?
  • 09-06 12:43