C ++ 0x元组向后存储元素

时间:2011-03-05 21:06:46

标签: memory c++11 tuples

经过一番调查后,我发现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:

error: parameter pack argument ‘head ...’ must be at the end of the template argument list

除非将来可以使用,否则我很难找到另一种方法来实现它。还有另外一种方法吗?有些方法可以欺骗GCC获得一个正确排序的元组内存吗?

2 个答案:

答案 0 :(得分:7)

您正在探索的元组布局是元组的未指定实现细节。其他实现将具有其他布局。如果你写这个,根据gcc的布局,你的代码可能无法移植到其他std :: libs。

libc++元组实现(例如)具有相反的(有序)布局。

答案 1 :(得分:6)

为什么你关心元组的实现是什么? Program to an interface, not an implementation

如果您只通过其广告界面使用元组,那么您将按照放入它们的顺序获取对象。如果您通过直接访问其内容来破坏封装,例如通过示例中的狡猾指针,然后所有的赌注都关闭了。