主题:关于寄存器变量~ -------------------------------------------------------------------------------- 楼主 shengaa 用寄存器变量的目的是为了提高运行速度,但是在用之前要先判断CPU寄存器是否有空,那么这个判断不是也额外增加了开销了么?? 这样运行速度不是等于没有提高么?? 不解~~~ -------------------------------------------------------------------------------- 第1楼 bruceteen 呵呵,是编译时判断的。 -------------------------------------------------------------------------------- 第2楼 shengaa 既然是编译时判断的,那生成可执行程序后,在运行时不是还要判断寄存器是否有空闲的么,不会在程序运行时就不判断了吧?就直接根据编译时判断的结果----把变量放在寄存器或者内存中?? 要是在编译的时候 寄存器有空,在运行可执行程序的时候,寄存器没空,那怎么办?? -------------------------------------------------------------------------------- 第3楼 euclid 可能编译器隐藏了一些代码,如果不空则原寄存器的内容进栈保存先~象汇编 -------------------------------------------------------------------------------- 第4楼 shengaa 所以说运行时还是要做出额外的开销的嘛 这样不就违背了用寄存器变量的原意了么 -------------------------------------------------------------------------------- 第5楼 euclid 你从哪里知道寄存器变量的愿意?自己臆造的吧。声明普通变量时开销可能更大。晕 这主要是操作系统的活儿 -------------------------------------------------------------------------------- 第6楼 FancyMouse 判断寄存器是否为空这个开销可以忽略不计 -------------------------------------------------------------------------------- 第7楼 shengaa 五楼的! 用寄存器变量 不就是为了快么? 难道你不知道??!! 操作系统的活? 我们就不要管了么?? 我才晕啊! -------------------------------------------------------------------------------- 第8楼 euclid 用寄存器变量 不就是为了快么? 难道你不知道??!! 哈哈,按你的意思不要寄存器虽然慢点也可以咯??哈,不要钻牛角尖 -------------------------------------------------------------------------------- 第9楼 shengaa 我可没这意思啊,你牛!什么意思都被你看出来了! 我只是想深入了解一下,寄存器变量在编译成可执行程序后,是否需要判定寄存器是否空! 呵呵 六楼的答案 倒是令我蛮信服的! -------------------------------------------------------------------------------- 第10楼 euclid 晕,还是多看书吧 -------------------------------------------------------------------------------- 第11楼 shengaa 呵,就是书上说的很少 所以才要问高人的啊 你是么? -------------------------------------------------------------------------------- 第12楼 bruceteen :)哎,这么简单的问题竟然没人知道,我真的很晕 比如代码 xxxxxx; reg int abc; yyyyy; 这段代码是编译器编译的,它在其间用到那些寄存器它不知道?比如 mov ax, 9 add ax, 12 那么它就可以确定还有bx可以使用,为什么要到运行时判断? -------------------------------------------------------------------------------- 第13楼 shengaa ! -------------------------------------------------------------------------------- 第14楼 shengaa 就是说是否用寄存器 在编译阶段确定!? 呵呵 那是否确定有什么意思呢??! -------------------------------------------------------------------------------- 第15楼 benb 寄存器在cpu内部 学过汇编就知道常用的存放数据的寄存器有ax,bx,cx,dx 而一般变量是放在内存中的。 cpu查询自己内部的寄存器是否为空基本不需要时间,可能不到一个cpu周期 而查询并读取内存中的变量却需要不知多少个cpu周期? 这样速度就差很多了。 -------------------------------------------------------------------------------- 第16楼 cmaster 你要去北京,身上衣服有10个口袋,非要到了北京才知道会有个空口袋? -------------------------------------------------------------------------------- 第17楼 shengaa 晕 关键是在没去北京前 你穿的是T恤 去后穿的是衬衫!! 编译时 和 编译成可执行程序后 环境变了 老大! -------------------------------------------------------------------------------- 第18楼 bruceteen to benb: I 服了 you,你的瞎扯看起来还像模像样,真的令人忍俊不住。 请问“cpu查询自己内部的寄存器是否为空”的指令是哪条? -------------------------------------------------------------------------------- 第19楼 yxz149 寄存器不够用时,编译器就把register变量变为普通的变量类型了,即存在内存中,这是编译器的工作。 尽管有些开销,但是相比之下,如果能成为register变量,理论上速度比在内存中的变量访问要快很多! -------------------------------------------------------------------------------- 第20楼 shengaa 唉 始终 没有哪个 能深入地分析一下啊 19楼所说的大家是都知道的,但是 本人始终想不通的一点 就是------------- 比如 a 声明为register变量,编译时 编译器发现有个寄存器空着,那么它把a作为register变量。 那么 我想知道的是 在代码编译成可执行程序后,以后无论何时运行这个程序,是不是变量a还是作为register变量? 要是这样的话,假如运行程序的时候,CPU无空的寄存器,那怎么办? -------------------------------------------------------------------------------- 第21楼 euclid sb 学完汇编再来吧~ 谁也不听你扯淡拉 -------------------------------------------------------------------------------- 第22楼 yxz149 想想也知道吧?如果寄存器用完了,那你变量就没地方放了么?那你的程序就会运行不了了么? 看来你一点都不懂编译原理 -------------------------------------------------------------------------------- 第23楼 shengaa sb 学完汇编再来吧~ 谁也不听你扯淡拉 汇编我可能不比你差~~ 呵 呵呵 看来是我表达不好呢 还是有人智商那个?? 算了 本来以为有谁真能懂点底层的知识的。 没想到引来了几个真真的SB 哈 大家都是来学习的,不要以为自己比别人懂的多! 年轻人! 还有楼上的那位 你的理解力 是否是有很多人怀疑过啊??!!

评论