比较不一定与同一数组相关联的指针



Brian W Kernighan & Dennis M. Ritchie, 2e的C Programming Language书,在第102-103页陈述如下:

在某些情况下,可以比较

…指针。如果p和q指向同一数组的成员,然后是==,!=,<,>=,等,工作正常。但是对于算术或,行为是未定义的与不指向相同成员的指针进行比较数组中。(有一个例外:第一个元素的地址数组的末尾可用于指针运算。

这个限制也适用于c++吗?我们有一些遗留代码,比较指针(特别是void*)基于它们的绝对地址值,而不考虑它们是否属于同一个数组,我担心我们是否需要重新访问该代码。

是。嗯,未指定而不是未定义,这样更安全。

转换为int_ptr是一个保证的往返过程。当指定<时,保证std::less<>{}( a, b )的行为良好并与<保持一致。

这个未指定的行为允许三种情况。

  • 原为分段内存;指针可以忽略段并更快地进行比较。
  • 现在,它允许某些优化。比如假设比较指针以某种方式派生。如果违反了假设,编译器可以返回任何值。
  • 在常量求值代码中阻止这种比较。

然而,当您违反该规则时,大多数编译器并不会立即崩溃。所以这不是一个非常重要的修复。至少有一个编译器实际上实现了更少的原始<

最新更新