设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
12
返回列表 发新帖
楼主: Tabris_Air
打印 上一主题 下一主题

alias重定义了怎么办……

 关闭 [复制链接]

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

11
发表于 2009-4-1 02:32:10 | 只看该作者
alias 在重定义方法的时候要先将就方法的地址入栈的说。

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
2 小时
注册时间
2007-9-4
帖子
251
12
发表于 2009-4-1 16:55:38 | 只看该作者
以下引用火焰猫燐于2009-3-31 18:32:10的发言:
<BR><SCRIPT language="javascript">
   
strCont="alias 在重定义方法的时候要先将就方法的地址入栈的说。";
document.write(ubb.spbShowTopic(strCont,1));
//-->
</SCRIPT>alias 在重定义方法的时候要先将就方法的地址入栈的说。

额,能否举个alias造成stack too leap的例子咩?
[fly][/fly]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
13
发表于 2009-4-1 18:42:58 | 只看该作者
程序运行时,函数代码是保存在进程地址空间的代码段中的,alias 的作用就是将函数复制一份到代码段,或是将全局变量复制一份到数据段中,只不过别名函数复制的是值,而别名全局变量仅仅复制地址~
在程序执行到调用某函数的时候才会操作栈内存,这时会将函数的返回地址和参数信息压入栈中(也就是汇编中的 push 指令),然后执行子程序,函数返回时获取并跳转到之前在栈中保存的返回地址继续执行
所以栈溢出的异常和 alias 复制了多少次函数没有关系,可以做一个测试,程序自动生成几万行 alias xx xx,符号各不相同,看看是否会产生栈溢出就知道了~
有些语言支持在栈上分配内存,比如 c++ 在栈上分配数组,如果数组长度超过了一定限度就会产生溢出……但 Ruby 的数组是堆中动态分配的对象,所以 Ruby 中 stack level too deep 这个异常多半是由于函数嵌套调用或者递归层次太深引起的,就像新月上面说的那样{/hx}
回复 支持 反对

使用道具 举报

Lv2.观梦者

神隐的主犯

梦石
0
星屑
299
在线时间
271 小时
注册时间
2008-2-22
帖子
7691

贵宾

14
发表于 2009-4-1 20:06:28 | 只看该作者
呀,测试了一下,是我理解错了。

道歉~~~~

《天空之城 —— 破碎的命运》
回复 支持 反对

使用道具 举报

Lv1.梦旅人

剑圣

梦石
0
星屑
50
在线时间
122 小时
注册时间
2008-8-31
帖子
778
15
 楼主| 发表于 2009-4-1 20:33:20 | 只看该作者
可是话说自从我把与战斗脚本有关的alias全部整合之后……
到现在还没有出现过报错 = =b
不解ing……


以下引用紫苏于2009-4-1 10:42:58的发言:

程序运行时,函数代码是保存在进程地址空间的代码段中的,alias 的作用就是将函数复制一份到代码段,或是将全局变量复制一份到数据段中,只不过别名函数复制的是值,而别名全局变量仅仅复制地址~
在程序执行到调用某函数的时候才会操作栈内存,这时会将函数的返回地址和参数信息压入栈中(也就是汇编中的 push 指令),然后执行子程序,函数返回时获取并跳转到之前在栈中保存的返回地址继续执行
所以栈溢出的异常和 alias 复制了多少次函数没有关系,可以做一个测试,程序自动生成几万行 alias xx xx,符号各不相同,看看是否会产生栈溢出就知道了~
有些语言支持在栈上分配内存,比如 c++ 在栈上分配数组,如果数组长度超过了一定限度就会产生溢出……但 Ruby 的数组是堆中动态分配的对象,所以 Ruby 中 stack level too deep 这个异常多半是由于函数嵌套调用或者递归层次太深引起的,就像新月上面说的那样


PC/IOS/Android共享的RM RPG:未名大学
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
16
发表于 2009-4-1 21:19:38 | 只看该作者
整合之后少了一个函数调用的步骤,所以是有区别的~
用 alias 可能出现这样的情况,比如想在原来的 start_phase5 基础上添加功能:
############## 原 RGSS 脚本 ##############
class Scene_Battle                       #
   def start_phase5                       #
     # 原来的 start_phase5                #
     # ...                                #
   end                                    #
end                                      #
##########################################

############## 插件脚本 1 ################
class Scene_Battle                       #
   alias xrxs26_start_phase5 start_phase5 #
   def start_phase5                       #
     # ...                                #
     xrxs26_start_phase5                  #
   end                                    #
end                                      #
##########################################

############## 插件脚本 2 ################
class Scene_Battle                       #
   alias xrxs26_start_phase5 start_phase5 #
   def start_phase5                       #
     # ...                                #
     xrxs26_start_phase5                  #
   end                                    #
end                                      #
##########################################


就会产生 stack level too deep 的异常了——
一开始 xrxs26_start_phase5 复制的是 RGSS 预定义的方法,插件脚本 1 中重新定义 start_phase5,添加新的东西,再执行原来的 start_phase5,至此都没有问题~
接着插件脚本 2 又 alias 了 start_phase5,愿意是想直接沿用旧的 start_phase5,但旧的 start_phase5 已经被插件脚本 2 覆盖为调用 xrxs26_start_phase5,所以在这之后调用 xrxs26_start_phase5 就会再次调用其本身,产生了一个无限循环……
虽然归根究底还是无限递归层次的问题,不过还是多少和 alias 有关系,上面说的不太准确,纠正下~
系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-12 06:10

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表