C++ 使用'的性能惩罚;自动';VisualStudio2010中的关键字

C++ 使用'的性能惩罚;自动';VisualStudio2010中的关键字,c++,performance,visual-studio-2010,c++11,C++,Performance,Visual Studio 2010,C++11,使用新的auto关键字降低了我的代码执行时间。我将问题缩小到以下简单代码段: #include <iostream> #include <map> #include <vector> #include <deque> #include <time.h> using namespace std; void func1(map<int, vector<deque<float>>>& m) {

使用新的
auto
关键字降低了我的代码执行时间。我将问题缩小到以下简单代码段:

#include <iostream>
#include <map>
#include <vector>
#include <deque>
#include <time.h>

using namespace std;

void func1(map<int, vector<deque<float>>>& m)
{
    vector<deque<float>>& v = m[1];
}

void func2(map<int, vector<deque<float>>>& m)
{
    auto v = m[1];
}

void main () {

    map<int, vector<deque<float>>> m;
    m[1].push_back(deque<float>(1000,1));

    clock_t begin=clock();
    for(int i = 0; i < 100000; ++i) func1(m);
    cout << "100000 x func1: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl;

    begin=clock();
    for(int i = 0; i < 100000; ++i) func2(m);
    cout << "100000 x func2: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl;

}
有人能解释一下为什么使用
auto
会导致如此不同的执行时间吗


显然,有一个简单的解决方法,即完全停止使用
auto
,但我希望有更好的方法来解决这个问题。

您正在将向量复制到
v

请尝试创建引用

auto& v = ...

正如Bo所说,您必须使用
auto&
而不是
auto
(注意,对于其他情况,也有
auto*
)。以下是您的代码的更新版本:

#include <functional>
#include <iostream>
#include <map>
#include <vector>
#include <deque>
#include <time.h>

using namespace std;

typedef map<int, vector<deque<float>>> FooType; // this should have a meaningful name

void func1(FooType& m)
{
    vector<deque<float>>& v = m[1];
}

void func2(FooType& m)
{
    auto v = m[1];
}

void func3(FooType& m)
{
    auto& v = m[1];
}

void measure_time(std::function<void(FooType&)> func, FooType& m)
{
    clock_t begin=clock();
    for(int i = 0; i < 100000; ++i) func(m);
    cout << "100000 x func: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl;
}

void main()
{
    FooType m;
    m[1].push_back(deque<float>(1000,1));

    measure_time(func1, m);
    measure_time(func2, m);
    measure_time(func3, m);
}

该死,你必须非常快地回答这些问题我认为(但我猜我错了)auto使用函数的返回类型。运算符[]的返回类型是引用,那么为什么我们需要添加额外的“&”?@MDman:
auto
删除顶级cv和引用,它会“衰减”导出的类型。@MDman:另外,如果导出的类型始终与表达式的类型完全相同,您如何创建副本?:)我认为这是让
auto
以这种方式运行的基本原理之一。
#include <functional>
#include <iostream>
#include <map>
#include <vector>
#include <deque>
#include <time.h>

using namespace std;

typedef map<int, vector<deque<float>>> FooType; // this should have a meaningful name

void func1(FooType& m)
{
    vector<deque<float>>& v = m[1];
}

void func2(FooType& m)
{
    auto v = m[1];
}

void func3(FooType& m)
{
    auto& v = m[1];
}

void measure_time(std::function<void(FooType&)> func, FooType& m)
{
    clock_t begin=clock();
    for(int i = 0; i < 100000; ++i) func(m);
    cout << "100000 x func: " << (((double)(clock() - begin))/CLOCKS_PER_SEC) << " sec." << endl;
}

void main()
{
    FooType m;
    m[1].push_back(deque<float>(1000,1));

    measure_time(func1, m);
    measure_time(func2, m);
    measure_time(func3, m);
}
100000 x func: 0 sec.
100000 x func: 3.136 sec.
100000 x func: 0 sec.