对于动态分配的基本类型数组,c++17 alignas() 说明符的正确 usage/syntax 是什么?

What is the correct usage/syntax for the c++17 alignas() specifier for dynamically allocated arrays of fundamental types?

这一定是一道重复题,我找了2天也没找到...

我将 MSVC 与 /std:c17 /std:c++17 一起使用,并尝试让 alignas(64) 处理双精度数组。下面代码中的语法是我发现的唯一可以编译的语法,但它没有对齐……通常,数组大约有 75% 的时间未对齐。我知道有很多方法可以用更复杂的语法来做到这一点,但是有没有一种方法可以像对结构或 class?

那样与 alignas() “正常工作”
double* AR;
int count=0, asize=10;
for (int i = 0; i < 1000; i++)
{
    AR = new double alignas(64)[asize];
    if (((uintptr_t)AR & 63) != 0) count++;
    //if (((uintptr_t)AR % 64) != 0) count++;
    delete[] AR;
}

虽然 C++17 确实有办法让 operator new 为其分配的内存分配对齐方式,但 C++ 中没有机制来指定 [=11= 分配的内存的对齐方式] expression outside of 正在分配的类型的对齐方式。也就是说,如果执行 new Tnew T[],分配的指针的对齐方式将为 alignof(T)。 C++17 添加了基于对齐的 operator new 分配器,其中 allows them to support over-aligned types.

如果您可以控制 T 并且可以在定义时通过 alignas 指定其对齐方式,这很好。但是,如果您使用的是其他人的类型或 double 等基本类型,则无法更改这些类型的对齐方式。所以没有办法直接使用new表达式来分配这样的内存。

您将不得不直接使用 ::operator new 在所需的对齐方式分配足够的内存,然后使用 placement-new 在那里实际创建对象。当然,placement-new on arrays 有很多问题。

我怀疑这编译成功只是因为 alignas 被认为是一个属性,并且在 new 表达式中将属性放在 [] 之前在语法上是合法的。它并不是为了实际工作,因为有 no statement in the section on new expressions that allows it to get the alignment of the allocation from anything other than alignof(T).