元组实现是否具有优化的布局?

时间:2016-03-26 18:42:15

标签: c++ c++11 tuples memory-alignment

在阅读this时,我对某个级别的元编程可以为您的班级布局做些什么感到惊讶。我必须承认,如果我不得不陈述我理解的内容,我就不会完全掌握所建议的最佳布局:

  

通过降序排列来排序类成员,即具有最大alignof结果的类型首先等等

如果我弄错了,请随意纠正我(如果你有一个简短的解释,为什么会发生这种情况会更好,我无法在我的问题中复制粘贴大部分理由),但我的问题在于另一个主题:

std::tuple的任何库实现是否都有这样的布局优化?

如果没有,是否有任何标准的代数数据类型,除了编写这样的机器之外,还有另一种方法可以为我的班级做这个吗?

1 个答案:

答案 0 :(得分:10)

没有库实现我知道优化布局以进行对齐。您可以使用此类程序来检查tuple布局:

#include <iostream>
#include <tuple>

struct empty {};

int
main()
{
    using T = std::tuple<double, int, empty, short, long>;
    T t{};
    std::cout << &t << '\n';
    std::cout << &std::get<0>(t) << '\n';
    std::cout << &std::get<1>(t) << '\n';
    std::cout << &std::get<2>(t) << '\n';
    std::cout << &std::get<3>(t) << '\n';
    std::cout << &std::get<4>(t) << '\n';
    std::cout << &t+1 << '\n';
    std::cout << sizeof(T) << '\n';
}

libc ++按声明的顺序存储元素,并为空成员优化空间。空的成员被分流到前面。样本输出:

0x7fff5ccf39f8
0x7fff5ccf39f8
0x7fff5ccf3a00
0x7fff5ccf39f8
0x7fff5ccf3a04
0x7fff5ccf3a08
0x7fff5ccf3a10
24

libstdc ++以与声明相反的顺序存储元素,并为空成员优化空间。空的成员被分流到前面。样本输出:

0x7ffe4fc5b2a0
0x7ffe4fc5b2b0
0x7ffe4fc5b2ac
0x7ffe4fc5b2a0
0x7ffe4fc5b2a8
0x7ffe4fc5b2a0
0x7ffe4fc5b2b8
24

VS-2015以声明的相反顺序存储元素,并且不会为空成员优化空间。样本输出:

0306FEF4
0306FF04
0306FF00
0306FEFC
0306FEF8
0306FEF4
0306FF0C
24

在这个例子中,我们看到为空成员优化空间并没有买任何东西,因为它无论如何都适合填充区域。

没有任何设施可以自动完成标准中减少填充的任务。