C++11 的标准里对 tuple 元素的布局没有要求, 但 libstdc++ 的实现里是直接按顺序存放的, 这在部分情况下, 内存布局不太好.
比如, std::tuple<char, double, char> 在 sizeof(double) = 8, alignof(double) = 8 时, 需要占用 24 个字节, 但如果重排为 double, char, char 时, 只需要 16 个字节. 再如 std::tuple<char, int, char, double, char> 需要占用 32 个字节(假设 int 占 4 字节且对齐, double 占 8 字节且对齐), 但重排一下, 可以只占用 16 字节.
重排的 tuple, 需要加一层编译期映射, 保持 std::get 的正确性, 就可以完全替换掉 std::tuple 的实现了.
代码见 gist
blogger compose is too suck to embed the code!