您可以将nullptr与其他指针进行比较以进行排序吗?它总是更小吗?

这个问题基于我发现监控可能内存泄漏的代码,因此它包含一些您可能不希望在常规程序中看到的代码,例如排序指针。

但是,我看到设置了一个指针nullptr,然后将该指针与最大地址进行比较。是否由 C++ 标准保证nullptr总是小于其他指针operator<

回答

您可以将 nullptr 与其他指针进行比较以进行排序吗?

不,您不能将nullptr指针或其他空指针常量与指针进行有序比较。


对于我的其余答案,我将介绍“您能否将具有空值的指针与其他指针进行比较以进行排序?”

是的。但结果是否有用是另一回事。

它总是更小吗?

否。除非另一个操作数也为空,否则在这种情况下,两个操作数都不能保证比较大或小。

标准报价(最新草案):

[expr.rel]

比较指向对象的不等指针的结果是根据符合以下规则的偏序定义的:

  • 【不适用】如果两个指针指向同一个数组的不同元素,或者指向其子对象,则要求指向下标较高的元素的指针比较大。
  • [不适用]如果两个指针递归地指向同一对象的不同非静态数据成员,或指向此类成员的子对象,则需要将指向后声明成员的指针进行比较,前提是这两个成员具有相同的访问权限控制([class.access]),两个成员都不是零大小的子对象,并且它们的类不是联合。
  • [适用]否则,两个指针都不需要比较大于另一个。

std::less如果您需要严格的总顺序,您应该使用来比较指针。Null 仍然不能保证作为最小值进行比较。

  • I have a platform that has addressable memory at 0x00000000 and at 0x40000000, and that uses 0x20000000 as `nullptr`. Comparing pointers with `<` would sort all RAM pointers before `nullptr`, and all ROM pointers after it.
  • I don't get the last link. Even on systems that have "pointers are integers, nullptr is just 0", the question whether `nullptr` is smallest still depends on the question whether the system treats pointers as signed or unsigned integers. That's pretty arbitrary; e.g. I don't think x86 has a natural choice. (You can use either `ja` or `jg` on pointers).

回答

不。涉及 nullptr 的小于比较没有指定的行为,虽然它们不涉及未定义的行为,但结果甚至不能保证一致。

< on 指针提供的保证非常有限。即使比较两个单独的堆分配对象也不能保证一致(为此,您需要std::less,它将始终在排序中的某个位置放置一个空指针,但不在标准定义的位置)。你可以说,最好是没有指向的对象将比较等于一个nullptr。

  • In real life it's almost always more pragmatic to follow the rules of the language than to try to guess what'll be safe.

以上是您可以将nullptr与其他指针进行比较以进行排序吗?它总是更小吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>