首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >vector<int> - auto或auto&?

vector<int> - auto或auto&?
EN

Stack Overflow用户
提问于 2013-05-13 22:05:41
回答 4查看 12.5K关注 0票数 6

游戏引擎微优化情况:我使用C++11 range for循环在vector<int>上使用auto关键字进行迭代。

更快的是:

代码语言:javascript
运行
复制
for(auto value : ints) ...

代码语言:javascript
运行
复制
for(auto& value : ints) ...
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-13 22:11:29

在关心哪个更快之前,你应该关心哪个在语义上是正确的。如果不需要更改正在迭代的元素,则应选择第一个版本。否则,您应该选择第二个版本。

当然,您可以反对,即使不需要更改向量的内容,仍然可以选择使用对const的引用

代码语言:javascript
运行
复制
 for(auto const& value : ints)

然后问题就变成了:哪个更快?通过引用const还是通过值?

同样,您应该首先考虑上面的语义是否正确,这取决于您在for循环中所做的事情:

代码语言:javascript
运行
复制
int i = 0;
for (auto const& x : v) // Is this correct? Depends! (see the loop body)
{
    v[i] = 42 + (++i);
    std::cout << x;
}

也就是说,对于基本类型,只要在语义上是正确的,我就会使用for (auto i : x)

我不认为性能会更差(相反,我希望性能会更好),但一如既往地,当涉及到性能时,支持您的假设的唯一有意义的方法就是测量、测量和测量。

票数 14
EN

Stack Overflow用户

发布于 2013-05-13 22:09:02

如果修改value并希望它修改向量中的实际元素,则需要auto&。如果您不修改value,它很可能会被编译成与autoauto&完全相同的代码(自己分析一下)。

我用基于QueryPerformanceCounter的计时器使用VS2012进行了一些计时...

代码语言:javascript
运行
复制
    m::HighResTimer timer;

    std::vector<int> ints(100000000, 17);

    int count = 0;

    timer.Start();
    for(auto& i : ints)
        count += i;
    timer.Stop();

    std::cout   << "Count: " << count << '\n'
                << "auto& time: " << duration_cast<duration<double, std::milli>>(timer.Elapsed()).count() << '\n';

    count = 0;
    timer.Reset();
    timer.Start();
    for(const auto& i : ints)
        count += i;
    timer.Stop();

    std::cout   << "Count: " << count << '\n'
                << "const auto& time: " << duration_cast<duration<double, std::milli>>(timer.Elapsed()).count() << '\n';

    count = 0;
    timer.Reset();
    timer.Start();
    for(auto i : ints)
        count += i;
    timer.Stop();

    std::cout   << "Count: " << count << '\n'
                << "auto time: " << duration_cast<duration<double, std::milli>>(timer.Elapsed()).count() << '\n';

结果..。

代码语言:javascript
运行
复制
Count: 1700000000
auto& time: 77.0204

Count: 1700000000
const auto& time: 77.0648

Count: 1700000000
auto time: 77.5819
Press any key to continue . . .

我不会在这里解读时差。对于所有的实际目的,它们都是相同的,并且会有轻微的波动。

票数 5
EN

Stack Overflow用户

发布于 2013-05-13 22:11:41

首先,如果您要修改值,请使用auto&,否则请不要这样做,因为您可能会意外更改它。

但在const auto&和简单的auto之间可能会有选择。我相信对于std::vector<int>来说,性能不是问题。

为什么要使用auto

  1. It's更易于read.
  2. It's允许更改(无需更改vector)

为什么要使用const auto&

  1. 它应该和其他类型一起使用,所以这样写更通用。此外,如果您将类型更改为任何复杂的类型,您将不会意外地得到性能问题。
  2. 它不允许更改此变量的值,因此在编译时可能会捕获一些错误。

在这两种情况下,你都应该知道你在做什么,。这可能取决于周期是否以某种方式改变了我们的范围。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16524057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档