【发布时间】: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