std :: vector在Linux和Windows中给出了不同的结果

时间:2018-04-17 00:03:25

标签: c++ optimization mingw stdvector

我有一项任务是分析当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中输出的差异吗?

2 个答案:

答案 0 :(得分:2)

不同之处在于它们是不同的实现方式。

您没有显示您的代码,因此我无法研究您使用的方法的实现差异,但我认为主要区别在于std::vector的实现。这完全取决于向量中插入的方式,特别是因为您存储了节点的而不是指针。这意味着在必要时对被复制的向量内的对象没有任何异议。

可能猜测insert的实现之间的差异可能是其中一个实现使用realloc来增加数组的大小,只要容量需要增加而另一个使用malloc然后复制所有值到新阵列。如果重新分配的内存(在第一种情况下)只是大小相同的内存地址,则不需要副本。

P.S。:为了将来参考,请在提出类似这样的问题之前阅读this page。重要的是要记住,当我们寻求帮助时,其他人并不像编写代码那样了解代码。

<强>更新

要检查差异是否与向量容量增加的方式不同,可以在开始插入向量之前调用std::vector::reserve。在参数中使用100或更多名称调用它,以便向量具有您要插入的数字Node的容量。

答案 1 :(得分:1)

您可能会发现此页面上的表格有用useful。它列出了用于在各种编译器上扩展矢量大小的几何比率。

应该预期结果不同的事实。 memory allocation / memory fragmentation的问题有很多解决方案。每个人都有自己的优点和缺点。我的建议是相信编译器编写器调整向量以获得最佳的默认分配方案,但如果您需要更多控制,请使用reserveshrink to fit手动管理分配。

进行side-effecting复制操作几乎绝不是一个好主意,但您的问题强调的是这是向量的要求。