鱼C论坛

 找回密码
 立即注册
查看: 2282|回复: 18

[已解决]关于register关键词,小甲鱼是不是讲错了

[复制链接]
发表于 2017-7-8 10:40:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第七章 函数08(新版)里的,抄的小甲鱼的代码。用不用register关键词,汇编代码都一毛一样。
最佳答案
2017-7-8 14:19:20
看不到
这个关键字是vc下是被忽略的
编译器当成没看到

汇编代码完全一样

汇编代码完全一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-8 11:00:28 | 显示全部楼层
电脑寄存器都被用上了,就没用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-8 11:16:14 | 显示全部楼层
alltolove 发表于 2017-7-8 11:00
电脑寄存器都被用上了,就没用了

可是我是抄小甲鱼的代码,为什么他的变快了,我的不行呢?
我要怎么改才能像他的那样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 13:41:29 | 显示全部楼层
视频教程中已经讲得很明白了哦 !register是非常有限的,定义了不代表一定就会使用。没使用的情况下跟没加是一样的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-8 13:51:10 | 显示全部楼层
ba21 发表于 2017-7-8 13:41
视频教程中已经讲得很明白了哦 !register是非常有限的,定义了不代表一定就会使用。没使用的情况下跟没加 ...

我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运行时的那样?
求解惑。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 13:58:27 | 显示全部楼层
mandala 发表于 2017-7-8 13:51
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运 ...

都说得很清楚了register是非常有限的。

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。注意是尽可能,不是绝对。你想想,一个CPU 的寄存器也就那么几个或几十个,你要是定义了很多很多register 变量,它累死也可能不能全部把这些变量放入寄存器吧,轮也可能轮不到你。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-8 13:59:41 | 显示全部楼层
mandala 发表于 2017-7-8 13:51
我就是想不通
为什么同样的代码他视频上有效,而在我电脑运行上无效?
我要怎么改才能像他运 ...

我只是想看看编译器处理register,将变量保存在寄存器中后,翻译的汇编代码是怎样的,虽然大概能够想象到,但就是想亲眼看到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-8 14:14:39 | 显示全部楼层
ba21 发表于 2017-7-8 13:58
都说得很清楚了register是非常有限的。

register:这个关键字请求编译器尽可能的将变量存在CPU内部寄 ...

你能指导下 怎么样才能让register生效,使变量被保存在CPU的寄存器中 吗?我想看下它的汇编代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 14:19:20 | 显示全部楼层    本楼为最佳答案   
看不到
这个关键字是vc下是被忽略的
编译器当成没看到
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 14:23:12 | 显示全部楼层
mandala 发表于 2017-7-8 14:14
你能指导下 怎么样才能让register生效,使变量被保存在CPU的寄存器中 吗?我想看下它的汇编代码。

少运行点程序,在纯DOS下试试。 估计你也看不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2017-7-8 14:27:58 | 显示全部楼层
求道于盲 发表于 2017-7-8 14:19
看不到
这个关键字是vc下是被忽略的
编译器当成没看到

小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 14:30:18 | 显示全部楼层
mandala 发表于 2017-7-8 14:27
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。

你自己也看到了
汇编代码是一样的
程序能怎么变快
无中生有?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-8 14:32:03 | 显示全部楼层
求道于盲 发表于 2017-7-8 14:30
你自己也看到了
汇编代码是一样的
程序能怎么变快

嗯 可能是小甲鱼老师讲错了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 15:18:49 | 显示全部楼层
Visual Studio 2017 下,开O1优化

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         long i;

  6.         for(i = 0; i < 0xffffff; i++)
  7.                 printf("%ld ", i);

  8.         return 0;
  9. }
复制代码

  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5. 00EC182D  push        esi  
  6.         register long i;

  7.         for(i = 0; i < 0xffffff; i++)
  8. 00EC182E  xor         esi,esi  
  9.                 printf("%ld ", i);
  10. 00EC1830  push        esi  
  11. 00EC1831  push        offset string "%ld " (0EC5B38h)  
  12. 00EC1836  call        _printf (0EC127Bh)  
  13. 00EC183B  inc         esi  
  14. 00EC183C  pop         ecx  
  15. 00EC183D  pop         ecx  
  16. 00EC183E  cmp         esi,0FFFFFFh  
  17. 00EC1844  jl          main+3h (0EC1830h)  

  18.         return 0;
  19. 00EC1846  xor         eax,eax  
  20. 00EC1848  pop         esi  
  21. }
  22. 00EC1849  ret  
复制代码


很明显,使用esi寄存器代替了变量i



不过,我发现即使去掉register关键字,照样使用寄存器,所以优化才是关键
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5.         long i;

  6.         for(i = 0; i < 0xffffff; i++)
  7.                 printf("%ld ", i);

  8.         return 0;
  9. }
复制代码


  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. int main(void)
  4. {
  5. 009F182D  push        esi  
  6.         long i;

  7.         for(i = 0; i < 0xffffff; i++)
  8. 009F182E  xor         esi,esi  
  9.                 printf("%ld ", i);
  10. 009F1830  push        esi  
  11. 009F1831  push        offset string "%ld " (09F5B38h)  
  12. 009F1836  call        _printf (09F127Bh)  
  13. 009F183B  inc         esi  
  14. 009F183C  pop         ecx  
  15. 009F183D  pop         ecx  
  16. 009F183E  cmp         esi,0FFFFFFh  
  17. 009F1844  jl          main+3h (09F1830h)  

  18.         return 0;
  19. 009F1846  xor         eax,eax  
  20. 009F1848  pop         esi  
  21. }
  22. 009F1849  ret  
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-7-8 15:21:20 | 显示全部楼层
再加一张图
无标题.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 15:23:13 | 显示全部楼层
mandala 发表于 2017-7-8 14:27
小甲鱼老师用的vc6(我的也是vc6),他在视频上说register后速度变快了,你俩说的矛盾了。

建议看新版的《带你学C带你飞》,这个关键词有强调过是没啥用的,因为通常情况下编译器会直接替你做主。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-7-8 19:22:21 | 显示全部楼层
register 用不用主要还是编译器决定的, 只不过使用 register 关键词,编译器可能会按你的要求放在寄存器里。不同的编译器做法也不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-9 09:49:59 | 显示全部楼层
人造人 发表于 2017-7-8 15:18
Visual Studio 2017 下,开O1优化

想不到是拿esi,edi这种存偏移地址的寄存器啊,我本来以为是用eax,ecx,edx呢。
受教了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-9 09:52:17 | 显示全部楼层
本帖最后由 mandala 于 2017-7-9 09:56 编辑
小甲鱼 发表于 2017-7-8 15:23
建议看新版的《带你学C带你飞》,这个关键词有强调过是没啥用的,因为通常情况下编译器会直接替你做主。


那个vim的操作令人望而却步,直接放弃了

ps:这个标题党竟然吸引了这么多大佬过来,好鸡冻
小甲鱼老师你好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 23:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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