std::vector 在 Linux 和 Windows 中给出了不同的结果
std::vector gives different results in Linux and Windows
我有一个任务来分析当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
或更多调用它,以便向量具有要插入的数字Node
s 的容量。
您可能会发现此页面上的表格很有用。它列出了用于在各种编译器上扩展矢量大小的几何比率。
您的结果不同的事实应该是意料之中的。内存分配/内存碎片问题有许多解决方案。每个人都有自己的优点和缺点。我的建议是相信编译器编写器来调整向量以充分利用默认分配方案,但是如果您需要更多控制,请使用保留和收缩来手动管理分配以适应。
进行副作用的复制操作几乎从来都不是一个好主意,但您的问题强调的是,这是向量的要求。
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- valgrind-hellgrind与泄漏检查的结果不同
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 在c++中用vector填充一个简单的动态数组
- vector.resize()中的分配错误
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 从返回 std::optional of std::vector 的函数中获取结果到调用方
- 使用 std ::transform 构造 std::vector.返回未命名结果的可能性?
- 为什么 std::when_any 使用 std::tuple 而不是 std::vector 作为其结果类型?
- std::vector 在 Linux 和 Windows 中给出了不同的结果
- boost::d ynamic_bitset 与 std::vector 的结果不一致<bool>?
- 从函数的返回值将元素C++存储到 std::vector 中时出现意外结果
- 使用两种不同的方法遍历 Vector 的结果不一致
- 为什么 std::sort 默认假定 std::vector< std::vector<int> >为 std::vector,从而产生错误的结果?
- C++ vector.end() 给出超出范围的结果 - 请告知
- 如何在 std::vector 中查找重复项<strings>并返回一个 std::list 它们按字母顺序排序,在该结果列表中没有重复项
- 可以将vector.size()的结果存储到int类型的变量中吗
- vector::insert在VS2010中执行意想不到的结果
- Auto it = vector.begin()结果类型不能转换为const_iterator
- Std::vector::insert给出意外的结果