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

5 c++ storage tr1 alignment c++11

我一直试图让我的头围绕TR1添加,称为aligned_storage.在阅读以下文档N2165,N3190N2140时,我不能在生命中看到一个语句,它清楚地描述了所使用的内存的堆栈或堆性质.

我已经看过msvc2010提供的实现,boost和gcc它们都提供了一个以联合使用为中心的基于堆栈的解决方案.

简而言之:

  • 是否已定义aligned_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];
};
Run Code Online (Sandbox Code Playgroud)

注意:这不是一个小问题.在发布答案之前,请尝试理解问题.

Jam*_*lis 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模板参数的默认参数为最大对齐值.)

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

  • 我不确定答案会比这更好.如果在`type`中动态分配数据,那将是什么意思?怎么可能对协调有任何帮助? (2认同)
  • @Zenikoder - 再次阅读标准报价.如果需要的话.:)`std :: aligned_storage <...> :: type`定义了一个带有请求对齐的POD类型.您可以在堆栈上或堆中为此类型分配存储,但这不相关. (2认同)
  • @Zenikoder:不客气.更严重的是,我想不明白这个问题.`aligned_storage`不分配任何内存; 它定义了一种类型,您可以使用它来分配足够大小和对齐的内存块来保存某些类型的对象.就像任何其他类型一样,你可以使用你想要的任何形式的分配:如果你声明一个静态的`aligned_storage`它将具有静态存储持续时间,如果你在本地声明它将具有自动存储持续时间,并且如果你动态分配它然后它将具有动态存储持续时间. (2认同)