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

Do tuple implementations have an optimized layout?

在阅读 this 时,我惊讶于某种级别的元编程可以为您的 class 布局做些什么。我必须承认,我并不完全了解建议的最佳布局,如果我必须说明我的理解,那就是:

ordering class member by descending alignment i.e. the type with the greatest alignof result goes first etc

如果我做错了,请随时纠正我(如果你能简短地解释为什么会这样,那就更好了,我无法在我的问题中复制粘贴大量的基本原理),但我的问题是关于另一个主题的:

std::tuple的库实现有这样的布局优化吗?

如果没有,是否有任何标准代数数据类型可以这样做,除了编写这样的机器之外,还有其他方法可以为我的 class 做到这一点吗?

据我所知,没有库实现优化对齐布局。您可以使用这样的程序来检查 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++ 按声明顺序存储元素,并针对空成员优化 space。空成员被分流到前面。示例输出:

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

libstdc++ 以声明的相反顺序存储元素,并针对空成员优化 space。空成员被分流到前面。示例输出:

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

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

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

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

标准中没有自动执行减少填充任务的工具。