免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: hitcser01
打印 上一主题 下一主题

[C] [面试]如果交换堆和栈的位置? [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2014-04-23 16:27 |只看该作者
我的评价就是——一个完全扯淡的问题

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
12 [报告]
发表于 2014-04-23 17:03 |只看该作者
回复 10# windoze

哈哈, 这个表情 {:2_176:}  应该送给提出这个问题的人嘛, 又不是我

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
13 [报告]
发表于 2014-04-23 17:07 |只看该作者
回复 11# cjaizss

不能同意更多啊

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
14 [报告]
发表于 2014-04-23 17:53 |只看该作者
本帖最后由 zylthinking 于 2014-04-23 17:55 编辑

回复 1# hitcser01

考虑 esp, 如果向下扩展, 则 esp 本身就是栈的边界, 同时是最后一个分配元素的地址; 若是向上扩展, 若 esp 为最后一个元素起始地址, 则编译器必须想办法记住最后一个分配的空间为多大; 若 esp 为最后一个元素后的地址, 则分配一个新元素时, 保存该元素的地址时必然免不了 一个 esp - 元素大小 的计算;

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
15 [报告]
发表于 2014-04-23 21:02 |只看该作者
回复 8# starwing83


    1. 比如 ARM 的硬件构架, stm 和 ldm 指令支持两个方向的压/弹栈.

    2. 怎么会访问到 IO 映射区呢, 内核的内存映射表敢这么设计? 另外 x86 的 IO 和 内存根本不在同一个物理地址空间. 你说的是 X86 早期还没有内存分页保护机制的情况吧(否则一旦启用mmu分页保护机制, 自然就涉及到页表填写, 操作系统会认真考虑页表的).

    3. DOS 这种单任务的系统根本不具备现代操作系统的重要特性, 与其说 DOS 是个操作系统, 不如说它是个文件系统管理程序, 谈不上对内存的保护和管理.

    4. Unix 系统不是发源在 x86 构架上, 不过那时的硬件压栈指令估计也是向下的, 因此早期栈向下增长确实和硬件设计相关. Linux 倒是发源在 386 上...

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
16 [报告]
发表于 2014-04-23 21:52 |只看该作者
回复 14# zylthinking


    其实不会有这个问题。如果是向后分配,那么esp的设置显然会反过来:即,入栈后esp指向的就是栈顶,而栈顶的元素数量可以认为是无限,直到下一次压栈。退栈的时候,直接将esp设置为其指向的值,恢复为上一个值。理论上来说,这样的设计可以解决“缓冲区溢出”的问题(因为新栈帧访问的永远是新的内存,不会遇到旧内存——方向不同)。而且这样的话,压栈只需要一条操作,而入栈也是一样。不再需要ebp了。

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
17 [报告]
发表于 2014-04-23 22:05 |只看该作者
回复 14# zylthinking

谢谢您的回复

还有一些疑问啊~

关于您说的 向上扩展时, "若 esp 为最后一个元素后的地址, 则分配一个新元素时, 保存该元素的地址时必然免不了 一个 esp - 元素大小 的计算" ,
考虑 向下扩展的情况,  若某一时刻要压入一个元素,仍然要计算该元素的大小,再让esp减掉该值, 免不了计算一次?
因此 从这方面看起来 向上/向下 没有太本质的区别?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
18 [报告]
发表于 2014-04-24 16:43 |只看该作者
回复 16# starwing83

入栈后esp指向的就是栈顶,而栈顶的元素数量可以认为是无限,直到下一次压栈
没理解什么意思啊, 你是说 esp 扮演 ebp 的角色? 那么下一次压栈时怎么知道真实的下一个元素的地址应该是在哪里的, 如果你不记忆长度的话
   

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
19 [报告]
发表于 2014-04-24 16:46 |只看该作者
hitcser01 发表于 2014-04-23 22:05
回复 14# zylthinking

谢谢您的回复


我的意思是说
int a; a  的地址是 addr
如果 esp == addr+ sizeof(a)
则  c = &a , 等同于 c = esp - sizeof(a);
而现有情况下, c = esp

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
20 [报告]
发表于 2014-04-24 21:24 来自手机 |只看该作者
本帖最后由 selfrun 于 2014-04-24 22:17 编辑

手机回复总是乱码!!
这个问题前提是说,进程地址空间,从低到高,依次是:代码段区域,数据段区域,bss,堆内存区域,栈内存区域,环境变量。是这个意思吧?
然后问你,为什么栈和堆的区域不能对调?

这个前提假设是错的,回答完毕。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP