我一直试图绕过称为aligned_storage的TR1添加。在阅读以下文档N2165,N3190和N2140时,我无法看到一个声明,它清楚地描述了正在使用的内存的堆栈或堆本质。
我已经看过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 一个微不足道的问题。在发布答案之前,请尝试理解问题。
答案 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
)都会在与任何类型对齐的地址返回内存。