2016-02-28 12 views
0

我试图确保一个对象在我将其添加到vector数据结构之前得到对齐。在回答一个warning C4316: 'Basic' : object allocated on the heap may not be aligned 16警告,我已经在为Basic对象如下:unique_ptr <>使用_aligned_malloc()的C++数据对齐

class Basic 
{ 
public: 
    Basic(); 
    ~Basic(); 
}; 

它在这里一个标准的对象。接下来,unique_ptrBasicnew实例被分配给这样做的好处。 (相对于标准的指针)

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()返回]并调用其​​,将具有新的指针分配?

+3

'e_Basic.reset = ...'?除非您询问编译器错误,否则请尝试显示正确的代码,最好是[最小,完整和可验证示例](http://stackoverflow.com/help/mcve)。 –

+0

哦,并且不需要投入'sizeof ...'的结果,它会自动输入'size_t'。你也应该尽可能避免使用C++中的C风格类型,如果可能的话,也可以使用普通类型。 ***如果您需要进行演员阵容,请先尝试使用'static_cast'。 –

+0

我编辑了帖子,谢谢。 –

回答

2

该代码有几个问题。

  1. 您分配,构建,然后立即销毁一个Basic对象无故。
  2. 您永远不会初始化由_aligned_malloc分配的内存中的Basic对象。
  3. 默认unique_ptr将释放它管理的内存与delete,但你没有new那个内存,你_aligned_malloc编辑它。这是一个糟糕的想法,并可能导致堆损坏和/或崩溃。

您可以通过不与new Basic()初始化你unique_ptr根本解决的第一个问题。

第二个可以使用放置新表达式进行修复。

第三可以通过给调用~Basic_aligned_free代替delete不过,请注意一个unique_ptr<Basic, my_deleter>是不同的类型unique_ptr<Basic>,所以你不能将它放入一个vector<unique_ptr<Basic>>unique_ptr一个定制删除固定。

第二个和第三个问题也可以通过重载Basic::operator newBasic::operator delete分别使用_aligned_malloc_aligned_delete固定的,但将意味着new Basic()总是使用_aligned_malloc,您可能会或可能不希望。

+0

现在还很早,我可以在没有剧烈的实施变化的情况下做出改变。我应该忽略对齐警告并以某种方式信任unique_ptr 指向向量中的对齐数据吗? –

+0

不 - 你应该听取给出的建议。 –

+0

谢谢澄清,我想确保存储在'unique_ptr '中的指针是对齐的。 –

相关问题