静态动态内存分配

所谓在编译期间分配空间指的是静态分配空间(相对于用new动态申请空间),如全局变量或静态变量(包括一些复杂类型的常量),它们所需要的空间大小可以在编译阶段确定明确计算出来,并且不会再改变,因此它们可以直接存放在可执行文件的特定的节里(而且包含初始化的值),程序运行时也是直接将这个节加载到特定的段中,不 必在程序运行期间用额外的代码来产生这些变量。ps*对应汇编的数据段分配;

 

其实在运行期间再看“变量”这个概念就不再具备编译期间那么多的属性了(诸如名称,类型,作用

域,生存期等等),对应的只是一块内存(只有首址和大小),

所以在运行期间动态申请的空间,是需要额外的代码维护,以确保不同变量不会混用内存。比如写new表示有一块内存已经被占用了,其它变量就不能再用它了;

 写delete表示这块内存自由了,可以被其它变量使用了。(通常我们都是通过变量来使用内存的,就编码而言变量是给内存块起了个名字,用以区分彼此)ps* 变量是给内存块起了个名字,对应汇编里头data:ds;data:myds;

data segment

dw 0,0,0

db 0,0,0

data ends

可以用ds:[0]只想变量的内存区域;

局部变量对应汇编的栈:

stack:ss

stack segment

db 4 dup (0)

stack ends

 

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

 本回答由提问者推荐

#include<iostream>

using namespace std;

 

int main(){

int *px,*py;

cout<<"&px: "<<&px<<" "<<"&py: "<<&py <<endl;

cout<<" px: "<<px <<" "<<" py: "<<py <<endl;

cout<<"*px: "<<*px<<" "<<"*py: "<<*py<<endl;

{

int x,y;

cout<<"&x: "<<&x<<" "<<x<<" "<<"&y: "<<&y<<" "<<y<<endl;

x=10,y=20;

cout<<"After x=10,y=20"<<endl;

cout<<"&x: "<<&x<<" "<<x<<" "<<"&y: "<<&y<<" "<<y<<endl;

px=&x,py=&y;

}

cout<<"out of {}"<<endl;

cout<<"&x free;px: "<<px<<" "<<*px<<" "<<"&y free;py: "<<py<<" "<<*py<<endl;

 

 

return 0;

 

}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值