std :: aligned_storage的分配目标(堆栈还是堆?)

时间:2010-12-29 08:16:32

标签: c++ c++11 storage alignment tr1

我一直试图绕过称为aligned_storage的TR1添加。在阅读以下文档N2165N3190N2140时,我无法看到一个声明,它清楚地描述了正在使用的内存的堆栈或堆本质。

我已经看过msvc2010提供的实现,boost和gcc它们都提供了一个基于堆栈的解决方案,主要围绕着使用union。

简而言之:

  • align_storage实现使用的内存类型(堆栈或堆)是否定义为基于堆栈?

  • 和,定义/确定的具体文件是什么?

注意:在MSVC10中,以下是aligned_storage类型的定义,在这种情况下,如果aligned_storage是自动变量,则在堆栈上创建数据(_Val,_Pad):

template<class _Ty, size_t _Len> 
union _Align_type
{   
   // union with size _Len bytes and alignment of _Ty
   _Ty _Val;
   char _Pad[_Len];
};

注意:这是 NOT 一个微不足道的问题。在发布答案之前,请尝试理解问题。

2 个答案:

答案 0 :(得分:12)

std::aligned_storage<Len, Align>只声明一个成员typedef(type)。

  

成员typedef type应为POD类型,适合用作任何大小最多为Len并且其对齐方为Align

(这是来自最新的C ++ 0x草案,N3225,20.7.6.6表53,但TR1规范中的语言N1836实际上是相同的,除了在C ++ 0x中Align template参数的最大对齐值为默认参数。)

std::aligned_storage本身不分配任何内存。您可以创建std::aligned_storage<Len, Align>::type类型的对象,并将该对象重新解释为任何符合上述要求的类型的对象。

答案 1 :(得分:0)

您通常不需要在堆上对齐内容,因为任何分配(new / malloc)都会在与任何类型对齐的地址返回内存。