C++ C++;0x元组向后存储元素
经过一点调查,我发现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无意中混淆的头文件后
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;
...
};