>我有一个代码,我在其中做了一些看起来像这样的事情:
double computeSometing(const double * parameters)
{
return useValues(parameters - 10);
// in this special case, useValues only uses values that are
// at least at parameters[0] or after
}
这看起来很糟糕,但只有在我知道 useValues
不会在第 10 个之前使用任何值的情况下调用此代码(情况并非总是如此(,因此使用的所有值都在"内部"parameters
。这是未定义的行为吗?我知道它仅适用于我使用过的所有编译器/平台,但这并不能定义它。
我这样做是为了避免将parameters
的内容复制到具有 10 个元素的新数组中,因为此函数对性能敏感。
减法具有未定义的行为。
[expr.add]:
如果表达式
P
指向数组对象的元素x[i]
x
n
元素,则表达式P - J
指向(可能假设的(元素x[i − j]
如果0 ≤ i − j ≤ n
;否则,行为是未定义的。
请注意,生成值的行为本身是未定义的 - 您甚至不需要使用结果。
不,你不能。
指针算术仅在数组中有效,但您可以设置指针以指向数组的最后一个元素,为此,对象被视为单元素数组。读取此类超出范围的指针(更不用说取消引用它(的行为是未定义的。
您不能简单地将数组与偏移量(也许是 std::ptrdiff_t
类型(一起传递吗?