【问题标题】:strict total order of std::less<Pointer>std::less<Pointer> 的严格总顺序
【发布时间】:2021-09-24 06:49:28
【问题描述】:

本题来自this comment

如果你说两个向量a和b,总顺序允许是&a[0], &b[0], &a[1], &b[1], &a[2], &b[2], ...,即元素交错。

这个订单是否允许?

我对标准了解不多。如果我只阅读与std::less 直接相关的部分,那似乎是正确的。

而且我发现 Herb Sutter 的 gcpp 库也有类似的用法(link):

    //  Return whether p points into this page's storage and is allocated.
    //
    inline
    bool gpage::contains(gsl::not_null<const byte*> p) const noexcept {
        //  Use std::less<> to compare (possibly unrelated) pointers portably
        auto const cmp = std::less<>{};
        auto const ext = extent();
        return !cmp(p, ext.data()) && cmp(p, ext.data() + ext.size());
    }

【问题讨论】:

  • 由于向量的元素必须是连续的,因此硬件需要一个非常奇怪的寻址方案。这种奇怪的寻址方案在 C++ 中仍然不可见,因为元素仍然必须是连续的。
  • @RichardCritten 我相信std::less 不需要只比较地址。它可以定义自己的顺序(根据comparison.general.2.1),例如偶数地址在前,奇数地址在后。当然,任何理智的实现都不会这样做,但这是一个语言律师的问题。
  • 我认为该注释解释了它上面的点 (2) 的含义。这与对defns.order.ptr 的引用相结合,我认为不允许提出的订单。
  • 对我来说,这很自然会发生在分段内存架构上,您首先比较每个段内的引用,然后如果相等,则比较它们所在的内存段。
  • @LanguageLawyer 跟随链接在stackoverflow.com/questions/39160613/… 中找到答案,详细信息和devblogs.microsoft.com/oldnewthing/20170927-00/?p=97095

标签: c++ pointers comparison language-lawyer


【解决方案1】:

是的,不同的数组(不是同一个完整对象的一部分)可以在排序中交错排列,但是每个数组必须单独正确排序——这就是总顺序的意思必须与内置运算符建立的偏序一致。 a+1 指向紧跟在 *a 之后的元素这一事实与不相关数组的问题无关,因为偏序正是索引和指针顺序之间的明显关系属于 one 完整对象. (事实上​​,“紧随其后”在这里是循环的,因为唯一可观察到的直接性是在数组索引本身中。整数转换不需要尊重它,所以你看不到“真实地址”。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    相关资源
    最近更新 更多