Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 复制基元类型行为的std::vector_C++_C++11_Vector_Language Lawyer_Memcpy - Fatal编程技术网

C++ 复制基元类型行为的std::vector

C++ 复制基元类型行为的std::vector,c++,c++11,vector,language-lawyer,memcpy,C++,C++11,Vector,Language Lawyer,Memcpy,背景: 使用其复制构造函数或复制赋值复制std::vector时,如下所示: std::vector<T> v1{T(),T(),T()}; std::vector<T> v2 = v1; std::vector v1{T(),T(),T()}; 标准:向量v2=v1; 发生深度复制 标准是否保证每个元素都会触发T的复制构造函数?换句话说,不会调用memcpy(或类似的东西)。(如果我错了,请纠正我) 问题: 另一方面,标准是否保证它将调用基本类型上的memcpy(或

背景:

使用其复制构造函数或复制赋值复制std::vector时,如下所示:

std::vector<T> v1{T(),T(),T()};
std::vector<T> v2 = v1;
std::vector v1{T(),T(),T()};
标准:向量v2=v1;
发生深度复制


标准是否保证每个元素都会触发
T
的复制构造函数?换句话说,不会调用
memcpy
(或类似的东西)。(如果我错了,请纠正我)

问题:


另一方面,标准是否保证它将调用基本类型上的
memcpy
(或类似的东西)(用于性能问题)?

为基本类型的副本构造生成的确切代码是一个实现质量问题。换言之,标准将不会保证任何类型的操作-充其量,它将指定操作的算法复杂性,在这种情况下,向量的复制可以推断为
O(n)


使用现代C++编译器,在合理的优化设置下,可以指望在POD类中实现在线复制,就像常数大小<代码> MeMCPY 。对于典型的用例,如指针的STL容器,执行任何其他操作都会招致严重的惩罚。

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

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


不,因为复制构造函数的实际实现方式是一个实现细节。该标准只指定了程序的(可观察的)行为,它使用了复制构造函数等概念。优化不是抽象的标准文档应该担心的,而是您的供应商。事实上,限制此类函数的定义要么会导致优化方面的巨大缺陷,要么会由于上述“仿佛”规则而被完全忽略。

“标准是否保证T的复制构造函数会为每个元素触发?”-肯定。它还能做什么?你为什么这么问?如果不给复制构造函数打电话那就太疯狂了。。。