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这段输入看出三个指针分配的区域为栈区, 而且是从高地址到低地址
继续思考:
代码:
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。