gpt4 book ai didi

c++ - C++ 数组可以在内存边界结束吗?

转载 作者:IT老高 更新时间:2023-10-28 12:39:07 25 4
gpt4 key购买 nike

C++ 标准(以及与此相关的 C)允许创建(虽然不是取消引用)指向数组末尾后一个元素的指针。这是否意味着数组永远不会被分配到其最后一个元素在内存边界处结束的位置?我了解在实践中部分/所有实现可能遵循此约定,但以下哪一项是正确的:

  1. 实际上是错误的,数组可能在内存边界处结束,或者
  2. C++ 标准要求在边界之前至少结束一个元素的内存值(value),或者
  3. 不是 1 也不是 2,但在实际编译器中仍然是这样,因为它使实现更容易。

C 的情况有什么不同吗?

更新:1 似乎是正确答案。请参阅下面 James Kanze 的回答,另请参阅 efence(http://linux.die.net/man/3/efence - 感谢 Michael Chastain 提供指向它的指针)

最佳答案

一个实现必须允许一个指向末尾的指针存在。它如何做到这一点是它的业务。在许多机器上,您可以安全地将任何值放入指针中,没有风险(除非你取消引用它);在这样的系统上,一个过去的指针可能指向未映射的内存——我已经居然在windows下遇到了一个case。

在其他机器上,只需加载指向未映射内存的指针放入寄存器会陷入陷阱,导致程序崩溃。上这样的机器,实现必须确保这不会发生,或者通过拒绝使用最后一个字节或字分配的内存,或者通过确保所有使用的指针除了取消引用它避免了任何可能的指令导致硬件将其视为无效指针。 (大多数这样的系统有单独的地址和数据寄存器,并且只会如果指针被加载到地址寄存器中,则陷阱。如果数据寄存器足够大,编译器可以安全加载指向数据寄存器的指针,例如比较。这是无论如何通常是必要的,因为地址寄存器并不总是支持比较。)

关于您的最后一个问题:C 和 C++ 在这方面完全相同; C++ 只是从 C 中继承了规则。

关于c++ - C++ 数组可以在内存边界结束吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26420348/

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