gpt4 book ai didi

c++ - std::copy_n 是否适用于重叠范围?

转载 作者:可可西里 更新时间:2023-11-01 17:56:55 26 4
gpt4 key购买 nike

我正在查看 N3485 25.3.1 [alg.copy] 中的 C++ 标准,它定义了 4 种算法:

  • 复制
  • copy_backward
  • copy_if
  • copy_n

copy 的描述中,有这个注释 25.3.1 [alg.copy]/3:

Requires: result shall not be in the range [first,last)

也就是说,当范围重叠时,copy 并不总是正确工作(类似于 memcpy)。

copy_backwardcopy_if 有相似的语言禁止重叠范围(分别为 25.3.1 [alg.copy]/14 和 25.3.1 [alg.copy]/8 ).

但是copy_n没有这样的禁止,也没有copy_n_backward。这是否意味着 copy_n 在范围重叠时做正确的事情?

(MSVC++ 的 copy_n 实现似乎委托(delegate)给了 std::memmove,所以我知道它在 MSVC++ 2013 上是安全的。但我不想依赖如果标准另有说明,则在此之上)

最佳答案

它是安全的*。为什么?因为标准没有说它安全。他们从 25.3.1 复制函数有 Requires: 他们需要的东西(这是在其他复制形式中规定的重叠禁令)。

然而,copy_n 没有说它要求范围不重叠,这意味着没关系,因为它没有被明确禁止。如果需要,它会说明。

*编辑: 当我说“安全”时,我的意思是它不是未定义的行为或不正确的程序。但是,如果内存范围重叠,则不能保证结果是您可能想要的结果。我们唯一可以保证的是:

  1. 对于每个非负整数i < n , *(result + i) = *(first + i)执行
  2. 不禁止调用具有重叠范围的函数,并且不会导致未定义的行为。

因此我们可以推断,如果范围重叠,则存储在目标中的结果不再保证是源的精确(按顺序)拷贝。我们保证目标中的每个值都来自源,但具体是哪些值取决于重叠和元素被复制的确切顺序。

因此,如果您所说的“安全”是指目的地始终拥有源的完美拷贝(如 memmove ),那么不,它不是“安全”的。但从某种意义上说,它是安全的,因为它本身不会导致未定义/无效的行为。

回顾一下,我们保证*(result + i) = *(first + i)将为整个范围内的每个元素完成。我们可以保证,如果范围重叠,程序仍然不是未定义的。我们不保证元素被复制的顺序。我们不能保证如果范围重叠,结果中存储的确切值将是什么(但我们知道它们都来自源)。

关于c++ - std::copy_n 是否适用于重叠范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20737258/

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