gpt4 book ai didi

c++ - std::vector 在 Linux 和 Windows 中给出不同的结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:43 24 4
gpt4 key购买 nike

我的任务是分析当 Node(由 long 值组成的对象)添加到它之前时 vector 的行为.我在 Node 的复制构造函数中放置了一个计数器,以查看当 vector 移动到新位置时(即当 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++;
}

排序 vector .cpp

vector<Node> data;

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

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

最佳答案

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

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

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

P.S.:为了将来引用,请阅读 this page在你问这样的问题之前。请务必记住,当我们寻求帮助时,其他人并不像编写代码的人那样了解代码。

更新

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

关于c++ - std::vector 在 Linux 和 Windows 中给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49867892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com