【发布时间】:2016-06-11 22:07:22
【问题描述】:
我试图确保在将对象添加到vector 数据结构之前对齐。响应warning C4316: 'Basic' : object allocated on the heap may not be aligned 16 警告,我有以下Basic 对象:
class Basic
{
public:
Basic();
~Basic();
};
这是一个标准的对象。接下来,分配unique_ptr 到Basic 的new 实例,以便这样做。 (相对于标准指针)
unique_ptr<Basic> e_Basic{new Basic()};
我尝试对齐数据,以便以后避免对齐问题:
e_Basic.reset =_aligned_malloc((size_t)sizeof(Basic), (size_t)(16 + (sizeof(Basic) % 16))); //Verify alignment.
最后添加指向vector数组的指针。
LocalBasicQueue.push_back(move(e_Basic));
编译器说它是犹太洁食,但我的“什么软糖?”代码感正在消失。这会导致指向(肯定)对齐代码的指针吗?
是否可以以这种方式声明(e_Basic.reset) 等于一个指针 [由_aligned_malloc() 返回] 并调用它的unique_ptr<>,并分配新的指针?
【问题讨论】:
-
e_Basic.reset = ...?除非您询问编译器错误,否则请尝试显示正确的代码,最好是 Minimal, Complete, and Verifiable Example。 -
哦,
sizeof ...的结果不用强制转换,它的类型自动为size_t。您还应该尽量避免在 C++ 中进行 C 风格的强制转换,如果可能的话,尽量避免使用一般的强制转换。 如果你需要做演员,先试试static_cast。 -
我编辑了帖子,谢谢。
-
@RashidEllis
e_Basic.reset = x;不是你能做的。你的意思是e_Basic.reset(x);? -
阅读更多关于 placement new 的信息,如答案中所建议的那样。 IE。只需分配正确的内存量并将其分配给
void*变量。然后使用该指针进行放置 new:e_Basic.reset(new (the_pointer) Basic);这将使用您通过_aligned_malloc分配的内存用于对象和 construct 对象(这是您缺少的构造步骤)。跨度>
标签: c++ vector malloc unique-ptr memory-alignment