对于动态分配的基本类型数组,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 T
或 new 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)
.
这一定是一道重复题,我找了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 T
或 new 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)
.