如果我知道只会使用现有元素,我可以在数组开头之前传递一个指针吗?

Can I pass a pointer to before the beginning of an array if I know only existing elements will be used?

我有一个代码,我在其中执行了如下操作:

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 号之前使用任何值的情况下调用此代码(情况并非总是如此),因此所有使用的值是 "inside" parameters。那是未定义的行为吗?我知道它只适用于我使用过的所有 compilers/platforms,但这并没有定义它。

我这样做是为了避免将 parameters 的内容复制到包含 10 个以上元素的新数组,因为此函数对性能敏感。

减法有未定义的行为。

[expr.add]:

If the expression P points to element x[i] of an array object x with n elements, [...] the expression P - J points to the (possibly-hypothetical) element x[i − j] if 0 ≤ i − j ≤ n; otherwise, the behavior is undefined.

请注意,产生值的行为本身是未定义的 - 您甚至不需要使用结果。

不,你不能。

指针运算仅在数组内有效,但您可以将指针设置为指向数组最后一个元素之后的指针,为此目的,对象被视为单个元素数组。读取此类超出范围的指针(更不用说取消引用它)的行为是未定义的。

您不能简单地传递数组和偏移量(可能是 std::ptrdiff_t 类型)吗?