使用std :: aligned_storage对齐静态数组

时间:2013-09-05 13:53:08

标签: c++ arrays pointers c++11 memory-alignment

我正在尝试使用 std :: aligned_storage 模式实现简单静态数组的16字节对齐:

#include <type_traits>
int main()
{
    const size_t SIZE = 8;
    using float_16 = std::aligned_storage<sizeof(float) * SIZE, 16>::type;
    float_16 mas;
    new(&mas) float[SIZE];//Placement new. Is this necessary? 

    mas[0]=1.f;//Compile error while attempting to set elements of aligned array
}

我收到以下编译错误:

  

«mas [0]»

中的«operator []»不匹配

然后我尝试使用显式指针转换:

float* mas_ = reinterpret_cast<float*>(mas); 

但这也会产生编译错误:

  

类型«float_16 {aka std :: aligned_storage&lt; 32u,   16u&gt; :: type}»键入«float *»

有人能建议我如何正确使用 std :: aligned_storage 对齐静态数组吗?

3 个答案:

答案 0 :(得分:8)

您可以使用:

float* floats = new (&mas) float[SIZE];

然后你可以使用:

floats[0] = 1.f;

根本没有reinterpret_cast:)

答案 1 :(得分:5)

mas不是指针。 reinterpret_cast必须专门涉及指针,引用或整数类型,并且仅在某些组合中:指向和来自整数类型的指针,指向指针的指针,对引用的引用或对自身的整数类型。在这种情况下,您试图将std::aligned_storage<32u, 16u>::type置于指针。你可以从中得到的最好的是对指针转换的引用,但这是不允许的。†。

尝试将其地址转换为另一种指针类型:reinterpret_cast<float*>(&mas);


†为了好玩:如果std::aligned_storage<32u, 16u>::type是指针类型,那么你可能得到的最差。这是值得怀疑的,因为32字节指针并不常见,但它可能发生在std::aligned_storage<8u, 8u>::type,例如,在一个非常讨厌的标准库中。我们称之为Hell ++。因此,在Hell ++中,它会编译得很好,你最终会将指针类型转换为另一个指针类型,然后对其进行所有恶意​​操作,如解除引用它。这将是灾难性的,因为如果std::aligned_storage<32u, 16u>::type是指针类型,则对象将没有存储的地址,但是它们将 存储。

答案 2 :(得分:2)

只做

alignas(16) float mas[SIZE];

std::aligned_storage是来自boost的C ++ 03遗物。