加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

一个关于内存使用的简单C问题

发布时间:2020-12-16 06:48:36 所属栏目:百科 来源:网络整理
导读:有什么区别(记忆明智): for(int x=0;x100;x++){ int y = 1+x;} 和 int y = 0;for(int x=0;x100;x++){ y = 1+x;} 我一直想知道它们是否相同或者首先是浪费记忆?… 解决方法 记忆方面,没有区别. y在堆栈中,无论它在方法中声明了什么.这里唯一的区别是y的范围
有什么区别(记忆明智):

for(int x=0;x<100;x++)
{
  int y = 1+x;
}

int y = 0;
for(int x=0;x<100;x++)
{
  y = 1+x;
}

我一直想知道它们是否相同或者首先是浪费记忆?…

解决方法

记忆方面,没有区别. y在堆栈中,无论它在方法中声明了什么.这里唯一的区别是y的范围:在第二种情况下,它仅限于for循环的主体;在第一个,它不是.这纯粹是在语言级别:同样,y以完全相同的方式分配,即在堆栈上.

为了使这一点非常清楚,这是一个代码示例:

void method1() {
    for (;;) {
        int a = 10;
    }
}

void method2() {
    int a;
    for (;;) {
        a = 10;
    }
}

以下是在两种情况下在调试模式下生成的汇编程序:

# method1() 
00000000  push        ebp  
00000001  mov         ebp,esp 
00000003  push        eax  
00000004  cmp         dword ptr ds:[00662E14h],0 
0000000b  je          00000012 
0000000d  call        5D9FE081 
00000012  xor         edx,edx 
00000014  mov         dword ptr [ebp-4],edx 
00000017  mov         dword ptr [ebp-4],0Ah 
0000001e  nop              
0000001f  jmp         00000017 

# method2() 
00000000  push        ebp  
00000001  mov         ebp,esp 
00000003  push        eax  
00000004  cmp         dword ptr ds:[002B2E14h],0 
0000000b  je          00000012 
0000000d  call        5ED1E089 
00000012  xor         edx,0Ah 
0000001e  nop              
0000001f  jmp         00000017

即使不了解任何有关装配的信息,您也可以看到两种方法具有完全相同的指令.换句话说,在声明a的位置,没有任何反应.

然而,如果你使用任何具有构造函数的类型,例如std :: vector:在它被声明的位置,则会调用构造函数,因此如果你在循环中声明它,那么它将是一个重要的区别.每次通过循环重建.例如:

for (/* index */) {
    std::vector<int> a; // invokes the constructor of std::vector<int> everytime
} // destructor called each time the object goes out of scope

std::vector<int> a; // constructor only called once
for (/* index */) {

}

如果你使用new,情况会变得更糟:这两段代码表现得非常不同:

for (/* index */) {
    char *a = new char[100]; // allocates 100 additional bytes every time !
} // must remember to delete[] a in the loop,otherwise it's a memory leak !

//////

char *a = new char[100]; // only one allocation
for (/* index */) {

}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读