首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >std::make_unique<alignas(32) std::byte[]>会分配对齐内存吗?

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

Stack Overflow用户
提问于 2022-11-07 05:12:37
回答 1查看 54关注 0票数 0

我想知道是否可以替换代码,比如

代码语言:javascript
复制
std::unique_ptr<std::byte[]> p { new (std::align_val_t{32}) std::byte[size]{} };

使用

代码语言:javascript
复制
auto p = std::make_unique<alignas(32) std::byte[]>(size);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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[]相同的类型。因此,

代码语言:javascript
复制
std::make_unique<std::byte[] alignas(32)>

是相同的

代码语言:javascript
复制
std::make_unique<std::byte[]>

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

这是一个常见的混乱根源,所以我将详细阐述一下。请考虑以下几点:

代码语言:javascript
复制
alignas(16) char c;

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74342218

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档