java Char与char_JAVAc++中char和char[]的区别

JAVAc++中char和char[]的区别

(2011-05-17 09:25:45)

标签:

杂谈

地方。

但是留意p1、p2自身是在栈中的。

2. 2申请后系统的响应

栈:只要栈的剩余空间大于所申请空间, 系统将为顺序提供内存, 否则将报异常提示栈溢出。

堆:首先应该晓得操作系统有一个记录闲暇内存地址的链表, 当系统收到顺序的申请时, 会遍历该链表,

寻找第一个空间大于所申请空间的堆结点, 然后将该结点从闲暇结点链表中删除, 并将

该结点的空间分配给顺序, 另外, 对于大少数系统,

会在这块内存空间中的首地址处记录本次分配的大小?庋?代码中的delete语句才干正确的释放本内存空间。 另外,

由于找到的堆结点的大小不一定正

好等于申请的大小?低郴嶙远慕嘤嗟哪遣糠种匦路湃胂邢玖幢碇小?

2. 3申请大小的限制

栈:在

存储的闲暇内存地

址的, 自然是不延续的, 而链表的遍历方向是由低地址向高地址。 堆的大小受限于计算机系统中有效的

虚拟内存。 由此可见, 堆获得的空间比拟灵敏, 也比拟大。

2. 4申请效率的比拟:

栈:由系统自动分配, 速度较快。 但顺序员是无法控制的。

堆:是由new分配的内存, 普通速度比拟慢, 而且容易产生内存碎片, 不过用起来最方便。

另外, 在windows下, 最好的方式是用virtualalloc分配内存, 他不是在堆, 也不是在栈,

而是直接在进

程的地址空间中保存一块内存, 虽然用起来最不方便。 但是速度快, 也最灵敏。

2. 5堆和栈中的存储内容

栈:在函数调用时, 第一个进栈的是主函数中后的下一条指令(函数调用语句的下一条可执行语句)的

JAVA地址, 然后是函数的各个参数, 在大少数的c编译器中, 参数是由右往左入栈的, 然后是函数中的局部变

量。 留意静态变量是不入栈的。

当本次函数调用完毕后, 局部变量先出栈, 然后是参数, 最后栈顶指针指向最开始存的地址, 也就是主

函数中的下一条指令, 顺序由该点继续运转。

堆:普通是在堆的头部用一个字节寄存堆的大小。 堆中的详细内容由顺序员布置。

2. 6存取效率的比拟

但是, 在以后的存取中, 在栈上的数组比指针所指向的字符串(例如堆)快。

比如:

对应的汇编代码

第一种在读取时直接就把字符串中的元素读到寄存器cl中, 而第二种则要先把指针值读到edx中, 在根据

edx读取字符, 显然慢了。

堆和栈的区别可以用如下的比喻来看出:

运用栈就象我们去饭馆里吃饭, 尽管点菜(发出申请)、付钱、和吃(运用), 吃饱了就走,

不必理会切菜、洗菜等准备任务和洗碗、刷锅等扫尾任务,饱腹减肥饼干 他的好处是快捷, 但是自由度小。

运用堆就象是自己入手做喜欢吃的菜肴, 比拟麻烦, 但是比拟契合自己的口味, 而且自由度大。

自我总结:

charc1="abc";实际上先是在文字常量区分配了一块内寄存"abc", 然后在栈上分配一地址给c1并指向

这块地址, 然后改变常量"abc"自然会解体

但是charc2[]="abc", 实际上abc分配内存的地方和上者并不一样, 可以从

2293624看出, 完全是两块地方, 推断4199056处于常量区, 而2293624处于栈区

2293620这段输入看出三个指针分配的区域为栈区, 而且是从高地址到低地址

继续思考:

代码:

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值