【发布时间】:2011-09-27 11:38:18
【问题描述】:
int* a = new int[5] - 1;
根据 C++ 标准,这一行本身会调用未定义的行为,因为 a 是一个无效指针,而不是一个过去的指针。同时,这是制作基于 1 的数组(第一个元素是 a[1])的零开销方式,我需要 project of mine。
我想知道这是否是我需要避免的事情,或者 C++ 标准是否只是保守地支持一些我的代码无论如何都不会运行的奇怪架构。所以问题是,这在哪些架构上会成为问题?这些是否普遍?
编辑:要查看上面的行确实调用了未定义的行为,请查看this question。
编辑:Dennis Zickefoose 指出,当调用未定义的行为时,允许编译器做任何事情,因此编译器和 CPU 都必须提供超出 C++ 标准的保证,这样的代码才能正常工作。我将问题扩展到任何现代 C++ 编译器是否存在此问题。
【问题讨论】:
-
计算永远不会不安全。可以取消引用。
-
@Ignacio Vazquez-Abrams 不正确。例如,允许 CPU 具有特殊的指针寄存器,如果您将某些无效的指针值加载到其中,则会发出错误。
-
Ignacio 的评论应作为答案发布并被接受。
-
Bjarke:如果您告诉我们您在谈论什么架构,那么这将很好地回答这个问题。
-
技术上,作为未定义的行为,即使硬件不会出错,如果编译器注意到你这样做,它也可以生成不正确的代码。并且一些编译器出于优化目的在分析中考虑了未定义的行为。鉴于您的具体情况,我不确定这是否可能 [
new T[5] - 1很可能是先前分配的T对象,在这种情况下你没问题],但在其他情况下,它可能会在没有硬件支持。
标签: c++ cpu-architecture