我想知道是否可以替换代码,比如
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);发布于 2022-11-08 05:25:18
嗯,第一个问题是没有像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。
对齐不是类型系统的一部分(当然,每个完整的类型都有对齐)。
https://stackoverflow.com/questions/74342218
复制相似问题