Rét*_*roX 6 c++ memory tuples c++11 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;
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.5.2编译时,我得到以下输出:
3
ab
Run Code Online (Sandbox Code Playgroud)
这最初困惑了我.为什么数据会向后存储?在通过GNU无意识混淆的标头搜索之后,我注意到实现类似于:
template<typename head, typename... tail> class tuple<head, tail...> : public tuple<tail...>
{
head value;
...
};
Run Code Online (Sandbox Code Playgroud)
因为基类包含最后一个元素,所以下一个派生类包含倒数第二个,等等,模板参数的实际顺序是相反的.
当我第一次进入元组时,我认为我可以将它们用于类似函数glInterleavedArrays()
,它将顶点数据数组设置为颜色,纹理坐标,法线和点的元组.当然,如果我创建一个元组数组,这些数据必须反向输入,如果你碰巧忘记按正确的顺序放置参数,这可能会导致非常奇怪的错误.
那么这样的事呢?
template<typename... head, typename tail> class tuple<head..., tail> : public tuple<head...>
{
tail value;
...
};
Run Code Online (Sandbox Code Playgroud)
根据GCC 4.5.2:
std::tuple<char, char, char> x('\0', 'b', 'a');
char* y = (char*)&x;
std::cout << sizeof(x) << std::endl;
std::cout << y << std::endl;
Run Code Online (Sandbox Code Playgroud)
除非将来可以使用,否则我很难找到另一种方法来实现它.还有另外一种方法吗?一些方法欺骗GCC获得一个正确排序的元组内存?
你为什么关心元组的实现是什么?编程到接口,而不是实现.
如果您只通过其广告界面使用元组,那么您将按照放入它们的顺序获取对象.如果您通过直接访问其内容(例如通过示例中投射的狡猾指针)来破坏封装,那么所有投注已经结束.