C++ 对齐存储的基本用途是什么?

C++ 对齐存储的基本用途是什么?,c++,C++,std::tr1::aligned_存储的基本用途是什么?它可以用作数据类型Foo的自动内存吗 struct Foo{...}; std::tr1::aligned_storage<sizeof(Foo) ,std::tr1::alignment_of<Foo>::value >::type buf; Foo* f = new (reinterpret_cast<void*>(&buf)) Foo(); f-&g

std::tr1::aligned_存储的基本用途是什么?它可以用作数据类型Foo的自动内存吗

   struct Foo{...};
   std::tr1::aligned_storage<sizeof(Foo)
        ,std::tr1::alignment_of<Foo>::value >::type buf;
   Foo* f = new (reinterpret_cast<void*>(&buf)) Foo();
   f->~Foo();
structfoo{…};
std::tr1::对齐的_存储::类型buf;
Foo*f=new(重新解释演员阵容(&buf))Foo();
f->~Foo();
如果是这样,那么在buf中存储多个Foo怎么样

    std::tr1::aligned_storage<5*sizeof(Foo)
            ,std::tr1::alignment_of<Foo>::value >::type buf;
    Foo* p = reinterpret_cast<Foo*>(&buf);
    for(int i = 0; i!= 5; ++i,++p)
    {
        Foo* f = new (p) Foo();
    }
std::tr1::aligned_storage::type buf;
Foo*p=重新解释铸件(&buf);
对于(int i=0;i!=5;++i,++p)
{
Foo*f=new(p)Foo();
}
它们是有效的程序吗?还有其他的使用案例吗?
Google search只提供有关对齐存储的文档,但很少提供有关对齐存储使用的文档。

好吧,除了您使用的
重新解释cast
,我觉得还可以。(第二个我不是100%肯定)

reinterpret\u cast
的问题在于,它不保证强制转换的结果,只是如果将结果强制转换回原始类型,则会得到原始值。因此,不能保证强制转换的结果将包含相同的位模式,或指向相同的地址

据我所知,将指针x投射到类型T*的便携式解决方案是
static\u cast(static\u cast(x))
,因为
static\u cast
往返
void*
保证将指针指向相同的地址


但这只与你的问题相关。:)

这是一个很好的解决办法。向void*或从void*进行静态_转换是可以的,但是对于多个静态_转换(如静态_转换(x)),如果x有一个类型,是否也是如此?然后我会把我所有的X型到Y型的石膏换成两个静态的石膏,而不是一个重新解释的石膏,只是为了感觉更安全。(我使用的GCC&MSVC 9编译器不会对reinterpret_cast造成任何伤害,我也不确定是否有其他编译器会这样做。但是,是的,我想更安全一点:))是的,我不知道有哪种编译器会出现reinterpret实际问题(我认为他们会让它在C++0x中像你期望的那样工作),但根据标准,这是未定义的行为。静态强制转换技巧应该适用于任何指针类型。
模板T指针强制转换(void*p){返回静态强制转换(p)}
。再加上常量重载版本(
constvoid*p
),将节省一些输入。Boost具有类似的功能,
静态指针强制转换
动态指针强制转换
。事实上,在当前以及(草案)C++1x标准中,
重新解释强制转换
到或从
无效*
是不允许的(尽管实现允许)。所以你真的应该使用
static\u cast
。在C++1x中,对于标准布局类型,
reinterpret\u cast(u)
是根据
static\u cast(static\u cast(u))
定义的。既然您已经判断
reinterpret\u cast
有问题,我可以问一下原因吗(技巧问题?)。否则如何将
对齐的存储映射到实际类型?是的,在C++11中,
reinterpret\u cast
(对于大多数类型,如果不是所有类型的话)相当于链式的
static\u cast
s。