我有一项任务是分析当vector
(由Node
值组成的对象)前置时long
行为的行为。
我在Node
的复制构造函数中放置了一个计数器,以查看当向量移动到新位置时调用的次数,即vector
增长时。
我得到以下结果:
Windows - MinGW编译器:
|--------------------Vector-------------------|
Size Time Creates Copies Destroys
100 0 ms 100 411 411
Linux:
|--------------------Vector-------------------|
Size Time Creates Copies Destroys
100 0 ms 100 227 227
Node.cpp
Node::Node(const Node& x){
this->value = x.get_value();
copy_count++;
}
SortedVector.cpp
vector<Node> data;
void SortedVector::prepend(const long value){
const Node x(value);
data.insert(data.begin(), x);
}
令人松恼的是,复制构造函数的计数与析构函数中的相同,但是,请您帮助我理解Linux和Windows中输出的差异吗?
答案 0 :(得分:2)
不同之处在于它们是不同的实现方式。
您没有显示您的代码,因此我无法研究您使用的方法的实现差异,但我认为主要区别在于std::vector
的实现。这完全取决于向量中插入的方式,特别是因为您存储了节点的值而不是指针。这意味着在必要时对被复制的向量内的对象没有任何异议。
可能猜测insert
的实现之间的差异可能是其中一个实现使用realloc来增加数组的大小,只要容量需要增加而另一个使用malloc然后复制所有值到新阵列。如果重新分配的内存(在第一种情况下)只是大小相同的内存地址,则不需要副本。
P.S。:为了将来参考,请在提出类似这样的问题之前阅读this page。重要的是要记住,当我们寻求帮助时,其他人并不像编写代码那样了解代码。
<强>更新强>
要检查差异是否与向量容量增加的方式不同,可以在开始插入向量之前调用std::vector::reserve
。在参数中使用100
或更多名称调用它,以便向量具有您要插入的数字Node
的容量。
答案 1 :(得分:1)
您可能会发现此页面上的表格有用useful。它列出了用于在各种编译器上扩展矢量大小的几何比率。
应该预期结果不同的事实。 memory allocation / memory fragmentation的问题有很多解决方案。每个人都有自己的优点和缺点。我的建议是相信编译器编写器调整向量以获得最佳的默认分配方案,但如果您需要更多控制,请使用reserve和shrink to fit手动管理分配。
进行side-effecting复制操作几乎绝不是一个好主意,但您的问题强调的是这是向量的要求。