代码之家  ›  专栏  ›  技术社区  ›  abir

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

c++
  •  10
  • abir  · 技术社区  · 15 年前

    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();
    

    如果是这样,那么在buf-like中存储多个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();
        }
    

    它们是有效的程序吗?它还有其他的用例吗? google search只生成关于对齐存储的文档,但很少生成关于它的使用的文档。

    1 回复  |  直到 15 年前
        1
  •  9
  •   Stack Overflow is garbage    15 年前

    嗯,除了你使用 reinterpret_cast 我觉得没问题。(我对第二个不完全确定)。

    问题在于 重新解释铸模 它不保证强制转换的结果,只有当您将结果强制转换回原始类型时,您才能得到原始值。因此,不能保证转换的结果将包含相同的位模式,或者指向相同的地址。

    据我所知,将指针x转换为t*类型的便携式解决方案是 static_cast<T*>(static_cast<void*>(x)) ,因为 static_cast 往返 void* 保证将指针指向同一地址。

    但这只是和你的问题无关。:)