假设您有一个数组:
int array[SIZE];
或者
int *array = new(int[SIZE]);
C 或 C + + 是否保证 array < array + SIZE
,如果是,在哪里?
我理解,无论语言规范如何,许多操作系统都通过为内核保留虚拟地址空间的顶部来保证这一属性。我的问题是,这是否也是 语言所保证的,而不仅仅是绝大多数实现所保证的。
例如,假设一个操作系统内核位于低内存中,并且有时为了响应匿名内存的 mmap
请求,将虚拟内存的最高页面提供给用户进程。如果 malloc
或 ::operator new[]
直接调用 mmap
来分配一个巨大的数组,并且数组的末端紧邻虚拟地址空间的顶端,使得 array + SIZE
绕到零,这是否意味着语言的不兼容实现?
澄清一下
注意,问题是 没有询问 array+(SIZE-1)
,array+(SIZE-1)
是数组最后一个元素的地址。那一个肯定比 array
大。问题是关于指针 超过数组末尾的,或者当 p
是指向非数组对象的指针时也是关于指针 p+1
的(所选答案所指向的标准部分清楚地表明以同样的方式处理该指针)。
Stackoverflow 要求我澄清为什么这个问题与 这个不同。另一个问题是如何实现指针的总排序。另一个问题实质上可以归结为一个库如何实现 std::less
,以至于它甚至可以对指向不同分配对象的指针起作用,标准规定只能比较相等性,不能大于或小于相等性。
相比之下,我的问题是,超过数组末尾的值是否总是保证大于该数组。不管我的问题的答案是“是”还是“否”,实际上并不会改变您实现 std::less
的方式,因此另一个问题似乎并不相关。如果与数组末尾的数据进行比较是非法的,那么在这种情况下,std::less
可以简单地展示未定义行为。(另外,标准库通常是由与编译器相同的人实现的,因此可以自由地利用特定编译器的属性。)