std::make_unique<alignas(32) std::byte[]>会分配对齐的内存吗?



我想知道我是否可以替换像

这样的代码
std::unique_ptr<std::byte[]> p { new (std::align_val_t{32}) std::byte[size]{} };

auto p = std::make_unique<alignas(32) std::byte[]>(size);

嗯,第一个问题是没有alignas(32) std::byte[]这种类型。它不是一个有效的类型id。您可以在这里看到类型id的语法。

要使alignas(32)适用于std::byte[],您必须将其放在末尾:std::byte[] alignas(32)。这在语法上是正确的,但是没有效果。换句话说,std::byte[] alignas(32)std::byte[]是同一类型。因此,

std::make_unique<std::byte[] alignas(32)>

相同
std::make_unique<std::byte[]>

它不会将分配的内存对齐到32字节的边界。

这是一个常见的混淆来源,所以我将详细说明一下。考虑以下内容:

alignas(16) char c;

变量(或非静态数据成员)c将对齐到16字节的边界。但是为什么呢?

很自然地认为alignas(16) charc的类型,并且由于该类型的对齐方式为16,因此该变量的对齐方式为16。但事实并非如此。alignas(16)应该被认为更像externinline。它适用于变量,而不是类型。c的类型为char, c的对齐方式为16.

对齐不是类型系统的一部分(尽管,当然,每个完整的类型都有对齐)。

最新更新