为什么向量在重新分配时必须移动其数据成员

时间:2017-06-24 15:55:01

标签: c++ vector

假设一个向量包含coord_reader='^[0-9], [0-9], [0-9]' while IFS='' read -r line || [[ -n "$line" ]]; do echo $line if [[ $line =~ $coord_reader ]]; then x=${BASH_REMATCH[1]} y=${BASH_REMATCH[2]} z=${BASH_REMATCH[3]} echo "x is $x, y is $y, z is $z" else echo "wrong" fi done < "$1" 实例内部的数组,实际上包含该类型的元素,如果bash shell.sh coords.txt实例正在使用,则该数组将被模板化。

当向量必须分配一个新的内存块并移动其所有元素时,为什么它会调用正在使用的每个元素的移动构造函数然后销毁旧元素?为什么不逐个字节地复制所有字节,只删除旧数组而不调用析构函数?这将使新数组成为旧数组的精确副本,而不会产生移动和销毁元素的开销。

也许我有点累了,错过了一些非常基本的东西。但我想不出为什么这样做不起作用的原因。

1 个答案:

答案 0 :(得分:6)

仅复制字节是不安全的。例如,想象一下,你的对象有两个成员p和d,而p是一个指向d的指针。如果你只是复制字节,你就会复制指向d的旧位置的p值,该位置已被销毁。

这是一个简单的例子,但一般来说,C ++构造函数,析构函数,复制和移动构造函数的原因是允许你的对象比单个字节序列更“智能”。成员变量具有意义,您的代码可以理解该含义,而不是编译器。