4

我一直在尝试了解 TR1 的附加功能,即对齐存储。在阅读以下文档N2165N3190N2140时,我一生都看不到清楚描述所使用内存的堆栈或堆性质的声明。

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

简而言之:

  • 是否定义了对齐存储实现使用的内存类型(堆栈或堆),或者它总是意味着基于堆栈?

  • 并且,定义/确定它的具体文件是什么?

注意:在 MSVC10 中,以下是对齐存储类型的定义,在这种情况下,如果对齐存储是自动变量,则在堆栈上创建数据(_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];
};

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

4

2 回答 2

12

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

成员 typedeftype应该是一个 POD 类型,适合用作任何对象的未初始化存储,其大小最多LenAlign

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

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

于 2010-12-29T08:23:13.817 回答
0

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

于 2010-12-29T08:47:51.427 回答