据我所知,没有库实现优化对齐布局。您可以使用这样的程序来检查 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
在这个例子中,我们看到为空成员优化空间并没有买任何东西,因为它无论如何都适合填充区域。
标准中没有任何工具可以自动执行减少填充的任务。