gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 04:54:05 24 4
gpt4 key购买 nike

例如,如果我有一个循环

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com