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

std::vector gives different results in Linux and Windows

本文关键字:结果 vector Linux Windows std      更新时间:2023-10-16

我有一个任务来分析当Node(由long值组成的对象)附加到vector时的行为。 我在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

节点.cpp

Node::Node(const Node& x){
this->value = x.get_value();
copy_count++;
}

排序向量.cpp

vector<Node> data;
void SortedVector::prepend(const long value){
const Node x(value);
data.insert(data.begin(), x);
}

令人欣慰的是,复制构造函数计数与析构函数中的相同,但是您能帮助我了解Linux和Windows中输出的差异吗?

区别是由于它们是不同的实现。

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

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

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

更新

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

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

您的结果不同的事实应该是意料之中的。内存分配/内存碎片问题有许多解决方案。每个人都有自己的优点和缺点。我的建议是相信编译器编写器来调整向量以充分利用默认分配方案,但是如果您需要更多控制,请使用保留和收缩来手动管理分配以适应。

进行副作用的复制操作几乎从来都不是一个好主意,但您的问题强调的是,这是向量的要求。

相关文章: