繁体   English   中英

复制原始类型行为的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 (或类似的东西)(针对性能问题)?

是的,必须调用T的复制构造函数。 如果复制构造函数是微不足道的,它的效果与memcpy的效果完全相同,因此使用后者实现该复制构造函数的实现很好。 从那时起,实现可能决定使用memcpy来实现vector的复制构造函数。 该决定使用as-if规则 :程序的可观察行为保持不变,因此我们不需要实际执行所有复制构造函数调用。

另一方面,标准是否保证它会在原始类型上调用memcpy(或类似的东西)(针对性能问题)?

不,因为实际上如何实现复制构造函数是一个实现细节。 标准只是指定程序的(可观察的)行为,它使用复制构造函数等的概念来实现。优化不是抽象的标准文档应该担心的,而是您的供应商。 实际上,限制这些函数的定义会导致优化中的巨大缺陷,或者由于前面提到的as-if规则而被完全忽略。

为原始类型的复制构造生成的确切代码是实现质量问题。 换句话说,标准不保证任何类型 - 最多,它将指定操作的算法复杂性,在这种情况下,矢量的复制可以推断为O(n)

使用现代C ++编译器进行合理的优化设置,您可以依赖于在线实现的POD类的复制构造,与常量大小的memcpy一样高效。 做其他事情会导致典型用例的严重处罚,例如指针的STL容器。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM