c++中为什么有些变量在编译时就由编译器分配了内存空间,还没有运行怎么会占用内存呢...

原文链接:https://my.oschina.net/u/920274/blog/3005262

还没有运行怎么会占用内存呢?!(这一点还要怀疑吗!?)

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大 小可以明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段 中,不必在程序运行期间用额外的代码来产生这些变量。
 
其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用域,生存期等等),对应的只是一块内存(只有首址和大小), 所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了; 写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)

内存申请和释放时机很重要,过早会丢失数据,过迟会耗费内存。特定情况下编译器可以帮我们完成这项复杂的工作(增加额外的代码维护内存空间,实现申 请和释放)。从这个意义上讲,局部自动变量也是由编译器负责分配空间的。进一步讲,内存管理用到了我们常常挂在嘴边的堆和栈这两种数据结构。

最后对于“编译器分配空间”这种不严谨的说法,你可以理解成编译期间它为你规划好了这些变量的内存使用方案,这个方案写到可执行文件里面了(该文件中包含若干并非出自你大脑衍生的代码),直到程序运行时才真正拿出来执行!

转载于:https://my.oschina.net/u/920274/blog/3005262

展开阅读全文
博主设置当前文章不允许评论。

内存占用太多,为什么

03-17

哪位能不能帮我优化一下?我这个程序不知道为什么,占用了很大的内存,速度很慢rntypedef struct AListrnrn int no1;rn int no2;rn int no3;rn int no4;rn int no5;rn rn TAList;rntypedef TAList* PAList;rnrnrnvoid __fastcall TForm1::FormCreate(TObject *Sender)rnrn randomize();rn ResultList = new TList; rnrnrnvoid __fastcall TForm1::Button1Click(TObject *Sender)rnrn DWORD StartTime,EndTime,LastTime;rn StartTime=GetTickCount(); //从这开始计算下面这个循环运行的时间rn for(int i=0;i<100000;i++)rn rn PAList AStruct;rn AStruct = new TAList;rn AStruct->no1=random(10);rn AStruct->no2=random(10);rn AStruct->no3=random(10);rn AStruct->no4=random(10);rn AStruct->no5=random(10);rn ResultList->Add(AStruct);rnrn rn //开始比较,此处占用了极多的内存rn for(int i=0;iResultList->Count-1;i++)rn rn PAList AStruct;rn AStruct = new TAList;rn AStruct = (PAList) ResultList->Items[i];rn for(int j=i+1;jResultList->Count;j++)rn rn PAList BStruct;rn BStruct = new TAList;rn BStruct = (PAList) ResultList->Items[j];rn int iSame=0;rn if(AStruct->no1==(BStruct->no1+1)) continue;rn if(AStruct->no2==(BStruct->no2+1)) continue;rn if(AStruct->no3==(BStruct->no3+1)) continue;rn if(AStruct->no4==(BStruct->no4+1)) continue;rn if(AStruct->no5==(BStruct->no5+1)) continue;rnrn if(AStruct->no1==(BStruct->no1+2)) continue;rn if(AStruct->no2==(BStruct->no2+2)) continue;rn if(AStruct->no3==(BStruct->no3+2)) continue;rn if(AStruct->no4==(BStruct->no4+2)) continue;rn if(AStruct->no5==(BStruct->no5+2)) continue;rnrn ResultList->Delete(j);j--; rn delete BStruct;rn rnrn rnrnEndTime=GetTickCount(); //循环结束,计时也结束rnLastTime=EndTime-StartTime;rnApplication->MessageBoxA(IntToStr(LastTime).c_str(),"运算时间",MB_ICONEXCLAMATION); rnrnrnvoid __fastcall TForm1::FormDestroy(TObject *Sender)rnrn if(ResultList->Count>0)rn for(int i=ResultList->Count-1;i<-1;i--)rn rn PAList AStruct;rn AStruct = new TAList;rn AStruct =(PAList) ResultList->Items[i];rn ResultList->Delete(i); rn delete[] AStruct;rnrn rnrn 论坛

没有更多推荐了,返回首页