gpt4 book ai didi

c++ - ptrdiff_t 可以表示指向同一数组对象的元素的指针的所有减法吗?

转载 作者:IT老高 更新时间:2023-10-28 12:39:49 26 4
gpt4 key购买 nike

用于将指针 ij 减去同一数组对象的元素 the note in [expr.add#5]阅读:

[ Note: If the value i−j is not in the range of representable values of type std​::​ptrdiff_­t, the behavior is undefined. — end note ]

但是给定 [support.types.layout#2] ,其中指出(强调我的):

  1. The type ptrdiff_­t is an implementation-defined signed integer type that can hold the difference of two subscripts in an array object, as described in [expr.add].

i-j 的结果是否有可能不在 ptrdiff_t 的可表示值范围内?

PS:如果我的问题是由于我对英语的理解不佳引起的,我深表歉意。

编辑: 相关:Why is the maximum size of an array "too large"?

最佳答案

Is it even possible for the result of i-j not to be in the range of representable values of ptrdiff_t?

是的,但不太可能。

事实上,[support.types.layout]/2除了关于指针减法和 ptrdiff_t 的正确规则外,没有多说。在 [expr.add] 中定义.那么让我们看看这个部分。

[expr.add]/5

When two pointers to elements of the same array object are subtracted, the type of the result is an implementation-defined signed integral type; this type shall be the same type that is defined as std​::​ptrdiff_­t in the <cstddef> header.

首先,注意i的情况和 j不考虑不同数组的下标索引。这允许处理 i-j作为 P-Q将在哪里 P是指向下标 i 处的数组元素的指针和 Q是指向下标j相同 数组元素的指针.实际上,将两个指向不同数组元素的指针相减是未定义的行为:

[expr.add]/5

If the expressions P and Q point to, respectively, elements x[i] and x[j] of the same array object x, the expression P - Q has the value i−j ; otherwise, the behavior is undefined.

作为结论,使用前面定义的符号,i-jP-Q被定义为具有相同的值,后者的类型为 std::ptrdiff_t .但是对于这种类型是否有可能持有这样的值,没有任何说法。然而,这个问题可以在 std::numeric_limits 的帮助下得到解答。 ;特别是,可以检测一个数组 some_array对于std::ptrdiff_t 来说太大保存所有索引差异:

static_assert(std::numeric_limits<std::ptrdiff_t>::max() > sizeof(some_array)/sizeof(some_array[0]),
"some_array is too big, subtracting its first and one-past-the-end element indexes "
"or pointers would lead to undefined behavior as per [expr.add]/5."
);

现在,在通常的目标上,这通常不会发生 sizeof(std::ptrdiff_t) == sizeof(void*) ;这意味着对于 ptrdiff_t 而言,数组需要非常大。溢出。但不能保证。

关于c++ - ptrdiff_t 可以表示指向同一数组对象的元素的指针的所有减法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49380475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com