如果我知道只会使用现有元素,我可以在数组开头之前传递一个指针吗?
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
类型)吗?
我有一个代码,我在其中执行了如下操作:
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 elementx[i]
of an array objectx
withn
elements, [...] the expressionP - J
points to the (possibly-hypothetical) elementx[i − j]
if0 ≤ i − j ≤ n
; otherwise, the behavior is undefined.
请注意,产生值的行为本身是未定义的 - 您甚至不需要使用结果。
不,你不能。
指针运算仅在数组内有效,但您可以将指针设置为指向数组最后一个元素之后的指针,为此目的,对象被视为单个元素数组。读取此类超出范围的指针(更不用说取消引用它)的行为是未定义的。
您不能简单地传递数组和偏移量(可能是 std::ptrdiff_t
类型)吗?