【发布时间】:2016-09-01 18:02:26
【问题描述】:
如果static_cast< std::uintptr_t >(&obj) == std::numeric_limits< std::uintptr_t >::max() - sizeof(obj) + 1 怎么办?比如说,obj 是连续 STL 容器(或本机数组)中的最后一个元素,使用迭代器范围的 STL 算法应该如何处理它?我确信连续容器的迭代器(甚至是调试版本)的设计方式是,它们使用过去元素的地址(不可取消引用,但有效)。
我知道,操作系统的常见设计是在可能的最高地址分配堆栈,并且对于统一内存系统,放置第一个调用函数的返回地址(至少 main)。但是有些系统可以在任何地址上分配堆栈(对于每个进程,我想要)。
【问题讨论】:
-
获得“最后一个”地址的唯一方法是操作系统是否会将其映射到您的进程,这将是一个非常糟糕的操作系统,因为“一个超出结尾”就是这样标记某事结束的常用方法。
-
这个问题似乎无关紧要。该标准要求末端迭代器存在并起作用。因此,如果系统无法处理最后一个元素为最高
uintptr_t值的数组的结束迭代器,那么实现 put 这样的数组是非法的元素放在首位。 -
如果修改需要重新分配/移动数据,迭代器就会失效。
-
@myaut 我可以移动实际数据并将对它的引用更改为我自己的迭代器实现。我认为,双重间接和侵入式迭代器并不违法。
标签: c++ memory stl iterator containers