首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安置-新地址对齐

安置-新地址对齐
EN

Stack Overflow用户
提问于 2017-03-01 01:22:33
回答 3查看 2K关注 0票数 14

根据https://isocpp.org/wiki/faq/dtors#placement-new的说法,传递到新位置的地址必须正确地对齐。但它给出的例子似乎与此相矛盾。

代码语言:javascript
运行
复制
char memory[sizeof(Fred)];

这个缓冲区很可能是,而不是,因为它是一个愚蠢的char[],所以memory可以指向几乎任何地方。在这个地址上有新的位置。

是一个与它在“脚注?”中所说的对齐要求相矛盾的例子。

这就引出了一个相关问题:

如何创建缓冲区(堆栈或堆),即对齐的类型T (用于放置-一个或多个T对象的新的)?

所谓缓冲区,我指的是一定大小的char[]void*缓冲区,而不是T[],因为这将是一个对象分配,这将使执行布局的目的失败--之后才是新的。

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2017-03-01 01:24:54

使用alignas关键字:

代码语言:javascript
运行
复制
alignas(Fred) char buf[sizeof(Fred)];
::new (static_cast<void*>(buf)) Fred;

或者使用std::aligned_storage,如果您喜欢这个构造的库包装器。

票数 18
EN

Stack Overflow用户

发布于 2017-03-01 01:33:17

关于你的第一个问题:根据answers to this related question是的,这个例子错了:

静态分配的数组对齐大小(Element_type)字节--对于char来说是1字节,这基本上不保证对齐。

因此,数组char memory[sizeof(Fred)]没有对Fred的对齐保证。

正确的方法如下(C++11):

代码语言:javascript
运行
复制
alignas(Fred) char memory[sizeof(Fred)];
票数 9
EN

Stack Overflow用户

发布于 2017-03-01 01:29:07

对于堆分配,只需使用std::malloc,它保证为任何类型分配对齐的内存。

对于堆栈分配,如果您可以访问C++11,则可以使用alignas,如下所示

代码语言:javascript
运行
复制
alignas(T) uint8_t data[sizeof(T)];

如果您没有访问C++11的权限,那么就必须回到GCC的__attribute__((aligned(N)))那样的特定编译器属性。

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

https://stackoverflow.com/questions/42521605

复制
相关文章

相似问题

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