我想知道我是否可以替换像
这样的代码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) char
是c
的类型,并且由于该类型的对齐方式为16,因此该变量的对齐方式为16。但事实并非如此。alignas(16)
应该被认为更像extern
或inline
。它适用于变量,而不是类型。c
的类型为char
, c
的对齐方式为16.
对齐不是类型系统的一部分(尽管,当然,每个完整的类型都有对齐)。