c++ - 一遍又一遍地重新定义变量是否会增加内存?

标签 c++ performance variables memory-management initialization

例如,如果我有一个循环

for(int i = 0; i < N; i++) {
    int a, b, c, d, e;
    cin >> a >> b >> c >> d >> e;
    foo(a, b, c, d, e);
}

int a, b, c, d, e;
for(int i = 0; i < N; i++) {
    cin >> a >> b >> c >> d >> e;
    foo(a, b, c, d, e);
}

哪个应该更快?在第一种情况下,我在 for 循环内部定义了五个变量,在第二种情况下,我在外部定义了它。

我看过讨论“哪个更快”的帖子,例如 Difference between declaring variables before or in loop? , 但我不确定哪个占用的内存更少。

我并不真正关心复杂性,而是关心程序中使用的内存量。

显然,在这种情况下,这并不重要,但如果我有一个多维 for 循环并且我必须定义变量数百万次怎么办?或者,如果我多次定义一个包含许多元素的大 vector 怎么办?

如果这个问题真的很简单,我很抱歉,因为我是 c++ 的新手。任何帮助将不胜感激。谢谢大家。

最佳答案

我将您的代码复制/粘贴到两个名为 foo.cpp 和 bar.cpp 的文件中:

foo.cpp:

#include <iostream>

void foo(int a, int b, int c, int d, int e) {
        std::cout << a << b << c << d << e << std::endl;
}

int main(int argc, char** argv) {
        for (int i = 0; i < argc; i++) {
                int a, b, c, d, e;
                std::cin >> a >> b >> c >> d >> e;
                foo(a, b, c, d, e);
        }
        return 0;
}

bar.cpp:

#include <iostream>

void foo(int a, int b, int c, int d, int e) {
        std::cout << a << b << c << d << e << std::endl;
}

int main(int argc, char** argv) {
        int a, b, c, d, e;
        for (int i = 0; i < argc; i++) {
                std::cin >> a >> b >> c >> d >> e;
                foo(a, b, c, d, e);
        }
        return 0;
}

我没有像这样优化编译它们(如果重要的话,使用 gcc 6.3 版):

g++ -O0 foo.cpp -o foo
g++ -O0 bar.cpp -o bar

即使没有优化,foo 和 bar 这两个结果也是相同的。为了确定这一点,您可以比较 objdumps:

objdump -D foo > foo.txt
objdump -D bar > bar.txt
diff foo.txt bar.txt

不过,有几点需要指出:

  • int 是原始类型,如果说这些不是类的实例,那么可能会有差异(在性能上,而不是内存使用上)。这是因为如果编译器(没有优化)没有使结果相同,那么循环的每次迭代都会创建和销毁实例
  • 您的变量正在占用堆栈内存(因为您没有使用new)。即使在编译器无法从两个代码中产生相同结果的情况下,您也会使用相同数量的内存
  • 如果您改为使用 new 创建变量,而不是在 for 循环中创建变量时删除它们,那么变量将占用堆空间而不是堆栈空间,然后第一个代码将使用更多内存。没有理由这样做,但如果您这样做了,您仍然可以通过在每个循环结束时调用 delete 来使用相同数量的内存

关于c++ - 一遍又一遍地重新定义变量是否会增加内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47545015/

相关文章:

c++ - 编译器看不到模板特化?

c++ - boost 或 C++11 是否具有与 tbb::queuing_mutex 和 tbb::spin_mutex 相同的互斥锁?

html - URL 变量中间的问号

c++ - 如何最简洁地将变量初始化为0?

java - 如何修复变量不等于用户输入

c++ - while 循环是否比 for 循环更有效

c++ - 防止对象在不需要时被链接?

android - Activity 转换期间动画缓慢

c++ - 组织 C++ 套接字服务器的最佳方式是什么?

java - JPA 的 EntityManager 何时提供优于普通 JDBC 的性能优势?