如果我知道仅将使用现有元素,是否可以在数组开头之前传递指针?

Vin*_*ond 5 c++ arrays pointers pointer-arithmetic language-lawyer

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

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
}
Run Code Online (Sandbox Code Playgroud)

这看起来很糟糕,但是仅在以下情况下才调用此代码:在这种情况下,我知道useValues在10号之前不会使用任何值(情况并非总是如此),因此所使用的所有值都是“ inside” parameters。那是不确定的行为吗?我知道它只能在我使用过的所有编译器/平台上运行,但这并没有定义它。

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

mol*_*ilo 6

减法具有不确定的行为。

[expr.add]:

如果表达式P指向元件x[i]阵列对象的xn元素,[...]的表达P - J指向(可能-假设的)元件x[i ? j],如果0 ? i ? j ? n; 否则,行为是不确定的。

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