【发布时间】:2019-10-03 21:42:46
【问题描述】:
在 Visual Studio 中,编译 64 位时:
-
sizeof(std::max_align_t)是 8 -
__STDCPP_DEFAULT_NEW_ALIGNMENT__是 16
所以尽管std::max_align_t 表示new 的实现应该返回对齐到8 字节的倍数的指针,但要求对齐为16 字节的分配不调用void* operator new (std::size_t count, std::align_val_t); 方法,而是调用void* operator new (std::size_t count);(参见https://en.cppreference.com/w/cpp/memory/new/operator_new) 并期望它们返回一个在 16 字节上对齐的指针。
所以分配一个这样定义的结构:
struct alignas(16) S {double m_value;};
将调用标准运算符new(不带std::align_val_t 参数)并期望它在16 个字节上对齐,而std::max_align_t 只指定它应该在8 个字节上对齐。
这意味着当否决 new 运算符时,您必须将所有内容至少对齐 16 个字节,即使 8 个字节就足够了。
- 我错过了什么吗?
- 这是 Visual Studio 实现 C++/STL 的方式中的错误吗?
- 或者这是 C++/STL 标准中的错误?
【问题讨论】:
-
[basic.align]/3 提到了这两个常量,但我不确定它们的值之间的关系意味着什么。由于该标准为大于每个对齐的对齐提供了不同的名称,因此我认为(故意)不能保证它们是相同的。但不能告诉你为什么。
-
在这种情况下它不会改变结果,但我认为你的意图是
alignof(std::max_align_t),而不是sizeof(std::max_align_t)。
标签: c++ visual-studio c++-standard-library