在循环外定义变量

时间:2014-10-01 00:56:42

标签: c++ performance variables memory

之间是否有任何性能差异:

uint a;
for (uint i = 0 ; i < n ; ++i)
{
    a = i;
}

for (uint i = 0 ; i < n ; ++i)
{
    uint a;
    a = i;
}

第二段代码是否会导致程序多次创建变量(分配内存或sth)而不是一次?如果不是,是因为两个代码都是等价的还是因为某些编译器优化?

3 个答案:

答案 0 :(得分:3)

我希望所有现代编译器在这两种情况下都能生成相同的代码。

您可能会惊讶地发现,对于大多数编译器而言,两种情况之间的开销量绝对没有任何区别。

简而言之,这些变量在堆栈上实例化,并且每个函数的编译器计算实例化函数内所有局部变量所需的最大堆栈量,并在函数&#中分配所需的堆栈空间。 39; s切入点。

当然,如果不是简单的int,而是在构造函数中有一些具有非常重要的复杂性的类,那么它肯定会在几个方面产生很大的不同。但对于像这样的简单int,绝对没有。

答案 1 :(得分:2)

假设uint是基本数据类型,我会说它们是相同的。当然,除了第一个例子中循环之后你可以使用a这个事实。这是因为在堆栈上放置基本数据类型的成本是微不足道的,编译器可以优化这种情况,因此内存实际上是保留一次,就好像你已经在循环外声明它一样。

如果uint是一个类,将它放在循环之外并重新使用它可能会更快。例如,在循环之前声明std::string并在循环内重用它可能比每次迭代创建一个新字符串更快。这是因为字符串可以重用其现有的动态内存分配。

您可以查看编译器的反汇编以查看是否存在任何差异。

答案 2 :(得分:0)

第二个示例必须稍微慢一点,因为正在为每次迭代重新定义a。这意味着正在留出空间来存储a的最大可能值(在这种情况下,可能是4个字节的内存)。该空间的分配是一个将被执行的命令,所以我认为它更慢。有关系吗?可能不是。