Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;0x元组向后存储元素_C++_C++11_Memory_Tuples_Stdtuple - Fatal编程技术网

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

C++ C++;0x元组向后存储元素,c++,c++11,memory,tuples,stdtuple,C++,C++11,Memory,Tuples,Stdtuple,经过一点调查,我发现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; 这最初让我感到困惑。为什么数据是向后存储的?在查找GNU无意中混淆的头文件后

经过一点调查,我发现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;
这最初让我感到困惑。为什么数据是向后存储的?在查找GNU无意中混淆的头文件后,我注意到实现与此类似:

template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...>
{
  head value;
  ...
};
根据GCC 4.5.2:

错误:参数包参数“head…”必须位于模板参数列表的末尾


除非这在将来变得可用,否则我将非常执着于寻找另一种方法来实现这一点。还有别的办法吗?有什么方法可以欺骗GCC获得一个有序的元组内存?

为什么您关心元组的实现是什么


如果您仅通过其广告接口使用tuple,那么您将按照放入对象的相同顺序取出对象。如果您改为通过直接访问其内容(例如通过示例中的狡猾指针)来破坏封装,则所有赌注都将被取消。

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


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

我已经说明了为什么-
glinterleavedarray()
是一个请求交错数据数组的函数。我的意图是创建一个元组类,该类将根据这个原则进行操作——在元组数组中交错数据,以便将数据传递给GL。如果您想了解更多信息,请参阅OpenGL文档:@RetroX:然后,您不需要依赖tuple的实现,而是需要一个对象,其接口提供了一种以已知顺序进行序列化的方法。无论哪种方式,您都希望接口提供保证,这样您就不会被实现细节所束缚。@PhilipPotter:
std::array
如果类型是同质的,那么这里显然是候选的,因为它与
std::tuple
具有相同的基本特性(大小在编译时固定,基本上为零开销),并且隐式地保证值按顺序存储(因为
data
返回一个原始指针,并保证范围
[data();data()+size())
是一个有效的范围,而对于非空数组,指针是第一个元素的地址)(这将允许您在大多数编译器中根据需要设置打包)。
template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...>
{
  tail value;
  ...
};