有谁能告诉我下面代码对内存的影响? 我的问题是:
代码1:
int num;long result;
for(int i=0;i<500;i++){
num = i;
result = num * num;
}
代码2:
for(int i=0;i<500;i++){
int num = i;
long result = num * num;
}
答案 0 :(得分:3)
在这两种情况下,只会创建一个num
和一个result
实例
唯一不同的是,代码2 num
和result
在循环后无法访问,并且用于保存它们的内存可以重复用于其他成员。
答案 1 :(得分:3)
重要事项:在源代码中声明局部变量的位置对实际分配和释放(例如堆栈上的推送/弹出)的发生时间影响很小。如果有的话,变量可能会完全被优化掉。
在您的C代码中,您分配本地变量的位置很可能对性能没有任何影响。因此,您应该声明局部变量,使其具有最佳可读性。
在这两种情况下,编译器都会推断出num
完全是多余的,并将其优化掉。不会为它分配任何内存。
在代码2中,编译器将推断出局部变量result
未在程序中的任何地方使用,因此它很可能将整个代码2优化为零。
代码1的机器代码如下所示:
allocate room for i
allocate room for result
set i to 0
loop:
multiply i by i
store in result
if i is less than 500, jump to loop
答案 2 :(得分:1)
有人能告诉我下面代码对内存的影响吗?
正如其他人所提到的,你的问题的答案在很大程度上取决于你正在使用的编译器。
[1]假设您打算稍后在循环中使用result
和num
进行其他计算,如下所示:
for(int i=0; i<500; ++i){
int num = i;
long result = num * num;
// more operations using num and result, e.g. function calls, IO, etc.
}
,现代编译器(gcc,llvm,mvc,icc)足够聪明,可以优化你提供给同一个东西的两个代码,因此在两个代码中相同的内存位置&#34;将在每次迭代时更新。
我把&#34;内存位置&#34;在引号中,因为变量可以被提升为寄存器,虽然严格来说仍然是内存,但访问速度要快得多,因此是常用变量的首选位置。
您的代码之间的唯一区别是变量的范围,但您可能已经知道了。
如果转换为[1],您以后不打算使用变量,编译器可能会检测到这一点,只是跳过循环,而不是为它生成任何机器代码,因为它是多余的。 / p>