0

这一定是重复的问题,但我搜索了2天没有找到......

我将 MSVC 与 /std:c17 /std:c++17 一起使用,并试图让 alignas(64) 与双精度数组一起使用。下面代码中的语法是我发现的唯一可以编译的语法,但它没有对齐……通常,数组大约 75% 的时间是未对齐的。我知道有很多方法可以使用更复杂的语法来做到这一点,但是没有一种方法可以像结构或类那样与 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;
}
4

1 回答 1

2

虽然 C++17 确实可以operator new为其分配的内存提供对齐方式,但 C++ 中没有机制来指定由正在分配的类型对齐之外的new表达式分配的内存的对齐方式。也就是说,如果您执行or ,分配的指针的对齐方式将是。C++17 添加了基于对齐的分配器,这允许它们支持过度对齐的类型new Tnew T[]alignof(T)operator new

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

您将不得不::operator new直接使用以在所需的对齐方式处分配足够的内存,然后使用placement-new在此处实际创建对象。当然,放置new阵列上存在许多问题。

我怀疑这只是因为alignas被认为是一个属性而编译的,并且[]new表达式中推一个属性在语法上是合法的。它并不打算实际工作,因为表达式部分中没有任何语句new允许它从除alignof(T).

于 2021-12-21T18:21:40.177 回答