【发布时间】:2011-03-05 21:06:46
【问题描述】:
经过一番调查,我发现 C++0x 将元素向后存储在内存中的元组中。
以这段代码为例:
std::tuple<char, char, char> x('\0', 'b', 'a');
char* y = (char*)&x;
std::cout << sizeof(x) << std::endl;
std::cout << y << std::endl;
使用 GCC 4.5.2 编译时,我得到以下输出:
3
ab
这最初让我感到困惑。为什么数据是向后存储的?在搜索了 GNU 无意中混淆的标头后,我注意到实现类似于:
template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...>
{
head value;
...
};
由于基类包含最后一个元素,那么下一个派生类包含倒数第二个等,模板参数的实际顺序是相反的。
当我第一次接触元组时,我认为我可以将它们用于像glInterleavedArrays() 这样的函数,它将顶点数据数组设置为颜色、纹理坐标、法线和点的元组。当然,如果我创建一个元组数组,这些数据将不得不反向输入,如果您碰巧忘记将参数按正确的顺序放置,这可能会导致非常奇怪的错误。
那么这样的事情呢?
template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...>
{
tail value;
...
};
在 GCC 4.5.2 下:
错误:参数包参数‘head ...’必须在模板参数列表的末尾
除非将来可以使用此功能,否则我几乎无法找到另一种实现此功能的方法。还有其他方法吗?有什么方法可以诱使 GCC 在内存方面获得正确排序的元组?
【问题讨论】:
标签: c++ c++11 memory tuples stdtuple