Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VS2010中函子(副本、赋值)的不同行为(与VS2005相比)_C++_Visual Studio 2010_Stl_Functor - Fatal编程技术网

C++ VS2010中函子(副本、赋值)的不同行为(与VS2005相比)

C++ VS2010中函子(副本、赋值)的不同行为(与VS2005相比),c++,visual-studio-2010,stl,functor,C++,Visual Studio 2010,Stl,Functor,当从VS2005移动到VS2010时,我们注意到性能下降,这似乎是由函子的额外副本引起的 下面的代码说明了该问题。必须有一个映射,其中值本身是一个集合。在映射和集合上,我们都定义了一个比较函子(在示例中是模板化的) 如果使用VS2010编译此文件,则会得到以下输出: --- 0 Construct functor B999 Copy functor B999 Copy functor B999 Destruct functor B999 Destruct functor B999 --- 1 C

当从VS2005移动到VS2010时,我们注意到性能下降,这似乎是由函子的额外副本引起的

下面的代码说明了该问题。必须有一个映射,其中值本身是一个集合。在映射和集合上,我们都定义了一个比较函子(在示例中是模板化的)

如果使用VS2010编译此文件,则会得到以下输出:

--- 0
Construct functor B999
Copy functor B999
Copy functor B999
Destruct functor B999
Destruct functor B999
--- 1
Construct object B0
Construct functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy object B0
Copy functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy object B0
Copy functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Destruct functor C999
Destruct object B0
Destruct functor C999
Destruct object B0
--- 2
--- 0
Construct functor B999
Copy functor B999
Copy functor B999
Destruct functor B999
Destruct functor B999
--- 1
Construct object B0
Construct functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy object B0
Copy functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy functor C999
Assign functor C999
Assign functor C999
Destruct functor C999
Copy object B0
Copy functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy functor C999
Assign functor C999
Assign functor C999
Destruct functor C999
Destruct functor C999
Destruct object B0
Destruct functor C999
Destruct object B0
--- 2
第一条语句(构造映射)的输出是相同的

第二条语句的输出(在映射中创建第一个元素并获取对它的引用)在VS2010中要大得多:

  • 复制函子的构造函数:10次对8次
  • 函子赋值:2次对0次
  • 函子的析构函数:10次对8次
我的问题是:

  • STL为什么复制函子?为集合的每个实例化构造一次它还不够吗
  • 为什么在VS2010案例中构造的函子比在VS2005案例中构造的函子多?(未检查VS2008)
  • 为什么它在VS2010中分配了两次,而在VS2005中没有分配
  • 有什么技巧可以避免复制函子吗

我在上看到了一个类似的问题,但我不确定这是否是同一个问题。

它们在发布版本中都使用了完全相同的编译器设置/优化标志?是的。在VS2005和2010上编译了3次。一次不带优化标志,一次带/Ox,一次带/Od。在所有结果中,我看到VS2010复制和分配函子的次数比VS2005多。是否也尝试过/O2?我不确定/Ox是否是/O2的严格超集。除此之外,你确定函子复制是你减速的原因吗?就我所见,函子只包含一个int,所以复制起来应该很简单。最后,STL不需要复制函子。它只允许这样做。它这样做是因为在某些情况下,这可能会实现额外的优化。至于避免复制,您可以尝试传递1)右值引用或2)普通值对象(而不是常量引用)。
--- 0
Construct functor B999
Copy functor B999
Copy functor B999
Destruct functor B999
Destruct functor B999
--- 1
Construct object B0
Construct functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy object B0
Copy functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy functor C999
Assign functor C999
Assign functor C999
Destruct functor C999
Copy object B0
Copy functor C999
Copy functor C999
Copy functor C999
Destruct functor C999
Destruct functor C999
Copy functor C999
Assign functor C999
Assign functor C999
Destruct functor C999
Destruct functor C999
Destruct object B0
Destruct functor C999
Destruct object B0
--- 2