复制 std::vector 原始类型行为
Copying std::vector of primitive types behavior
背景:
当使用复制构造函数或复制赋值复制 std::vector
时:
std::vector<T> v1{T(),T(),T()};
std::vector<T> v2 = v1;
发生深拷贝。
标准保证每个元素都会触发T
的拷贝构造函数吗?换句话说,不会调用 memcpy
(或类似的东西)。 (如果我错了请纠正我)。
问题:
另一方面,标准是否保证它会调用 memcpy
(或类似的东西)基元类型(用于性能问题)?
为原始类型的复制构造生成的确切代码是实现质量问题。换句话说,该标准不会 保证 任何类型的东西 - 充其量,它会指定操作的算法复杂性,在这种情况下,向量的复制可以推断为 O(n)
.
现代 C++ 编译器采用合理的优化设置,您可以指望内联实现的 POD 类 的复制构造,与常量大小 memcpy
一样高效。做任何其他事情都会对典型用例造成严重的惩罚,例如指针的 STL 容器。
是的,必须调用T
的复制构造函数。如果复制构造函数是微不足道的,它的效果与 memcpy
完全相同,因此可以使用后者来 实现 该复制构造函数。从那时起,实现可能会决定使用 memcpy
来实现 vector
的复制构造函数。该决定利用了 as-if rule:程序的可观察行为保持不变,因此我们不需要实际执行所有复制构造函数调用。
On the other hand, does it guaranteed by the standard that it would
call memcpy (or something similar) on primitive types (for
performance issues)?
不,因为复制构造函数的实际实现方式是一个实现细节。该标准仅指定程序的(可观察的)行为,并且它使用复制构造函数等概念来实现。优化不是抽象标准文档应该担心的,而是您的供应商。事实上,限制此类函数的定义要么会导致优化方面的巨大缺陷,要么会由于上述假设规则而被完全忽略。
背景:
当使用复制构造函数或复制赋值复制 std::vector
时:
std::vector<T> v1{T(),T(),T()};
std::vector<T> v2 = v1;
发生深拷贝。
标准保证每个元素都会触发T
的拷贝构造函数吗?换句话说,不会调用 memcpy
(或类似的东西)。 (如果我错了请纠正我)。
问题:
另一方面,标准是否保证它会调用 memcpy
(或类似的东西)基元类型(用于性能问题)?
为原始类型的复制构造生成的确切代码是实现质量问题。换句话说,该标准不会 保证 任何类型的东西 - 充其量,它会指定操作的算法复杂性,在这种情况下,向量的复制可以推断为 O(n)
.
现代 C++ 编译器采用合理的优化设置,您可以指望内联实现的 POD 类 的复制构造,与常量大小 memcpy
一样高效。做任何其他事情都会对典型用例造成严重的惩罚,例如指针的 STL 容器。
是的,必须调用T
的复制构造函数。如果复制构造函数是微不足道的,它的效果与 memcpy
完全相同,因此可以使用后者来 实现 该复制构造函数。从那时起,实现可能会决定使用 memcpy
来实现 vector
的复制构造函数。该决定利用了 as-if rule:程序的可观察行为保持不变,因此我们不需要实际执行所有复制构造函数调用。
On the other hand, does it guaranteed by the standard that it would call memcpy (or something similar) on primitive types (for performance issues)?
不,因为复制构造函数的实际实现方式是一个实现细节。该标准仅指定程序的(可观察的)行为,并且它使用复制构造函数等概念来实现。优化不是抽象标准文档应该担心的,而是您的供应商。事实上,限制此类函数的定义要么会导致优化方面的巨大缺陷,要么会由于上述假设规则而被完全忽略。