gpt4 book ai didi

c++ - 是否在特定实现上定义了两个数组之间的指针差异?

转载 作者:行者123 更新时间:2023-12-03 06:49:41 26 4
gpt4 key购买 nike

根据C标准:

When two pointers are subtracted, both shall point to elements of thesame array object, or one past the last element of the array object(sect. 6.5.6 1173)


[注意:不要以为我知道很多标准或UB,我只是碰巧发现了这个]
  • 我知道在几乎所有情况下,在两个不同的数组中获取指针的差异无论如何都是一个坏主意。
  • 我也知道在某些架构上(我在某处读到的“分段机器”),有充分的理由表明行为未定义。

  • 另一方面,现在
  • 它在某些极端情况下可能很有用。例如,在 this post ,它将允许使用具有不同数组的库接口(interface),而不是将所有内容复制到一个数组中,然后将其拆分。
  • 似乎在“普通”架构上,“所有对象都存储在一个从大约 0 开始到大约内存大小结束的大数组中”的思维方式是对内存的合理描述。当您真正查看不同数组的指针差异时,您会得到合理的结果。

  • 因此我的问题是:从实验来看,似乎在某些架构(例如 x86-64)上,两个数组之间的指针差异提供了合理的、可重复的结果。它似乎与这些架构的硬件相当吻合。那么某些实现是否实际上确保了特定的行为?
    例如,在野外有没有保证 a 的实现?和 b正在 char* , 我们有 a + (reinterpret_cast<std::ptrdiff_t>(b)-reinterpret_cast<std::ptrdiff_t>(a)) == b ?

    最佳答案

    Why make it UB, and not implementation-defined? (where of course, for some architectures, implementation-defined will specify it as UB)


    这不是它的工作原理。
    如果某些东西被标准记录为“实现定义的”,那么任何符合要求的实现都应该是 定义 这种情况下的行为,并记录下来。让它未定义不是一种选择。
    由于不相关数组之间的标记指针差异“实现定义”会留下例如 segmentedHarvard没有办法有一个完全一致的实现的架构,这种情况仍然没有被标准定义。
    实现可以提供定义的行为作为非标准扩展。但是任何使用这种扩展的程序都将不再严格符合,并且不可移植。

    关于c++ - 是否在特定实现上定义了两个数组之间的指针差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63905615/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com