这段代码对内存有什么影响

时间:2015-05-12 13:39:56

标签: c

有谁能告诉我下面代码对内存的影响? 我的问题是:

  1. 在代码1中,每个都是相同的内存位置 在循环中的时间?
  2. 在代码2中,是在声明并在for循环中分配变量时分配的新内存吗?
  3. 代码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;
    }
    

3 个答案:

答案 0 :(得分:3)

在这两种情况下,只会创建一个num和一个result实例 唯一不同的是,代码2 numresult在循环后无法访问,并且用于保存它们的内存可以重复用于其他成员。

答案 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]假设您打算稍后在循环中使用resultnum进行其他计算,如下所示:

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>