使用register关键字为何使C代码更快?实测存疑求解
关于C语言register关键字的作用疑惑解答
核心结论
你的测试结果是无优化编译场景下的特殊情况,现代编译器的自动优化能力已经让register关键字的实际优化作用变得非常有限,但它并非完全没用。
你的测试代码为啥会有差异
你写的循环是靠int类型溢出(count++直到溢出变成0)触发终止,在GCC默认的-O0(无优化)编译级别下:
- 没加register时,变量
count存在内存里,每次循环都要从内存读出来、自增、再写回内存——内存访问的开销比寄存器操作大得多; - 加了register后,编译器会优先把
count放到CPU寄存器里,循环时只在寄存器里操作,省去了内存读写的步骤,所以速度快了好几倍。
但要是开启编译器优化(比如-O2或-O3),你会发现加不加register的运行时间几乎没差别——现代编译器能自动识别这个循环里count是高频使用的变量,主动把它放到寄存器里,根本不需要你手动提示。
register关键字现在还有啥用
- 过去的作用:早年编译器优化能力差,程序员得靠register告诉编译器“这个变量用得特别多,放寄存器里省点时间”。
- 现在的意义:
- 现在的编译器(比如GCC、Clang)优化器贼聪明,能精准找出高频变量自动分配寄存器,手动加register基本是多余的;
- 它唯一的强制效果是不准对这个变量取地址(因为寄存器没有内存地址),这个特性在极少数场景可能有用,但日常开发几乎碰不到;
- 而且编译器完全可以不理你这个register请求,它只是个“建议”,不是命令。
你可以这么验证
用下面的命令编译两个版本的代码,再对比运行时间:
# 开启O2优化编译 gcc -O2 no_register.c -o no_register gcc -O2 with_register.c -o with_register # 运行看结果 ./no_register ./with_register
这时候两个程序的速度应该差不多,因为编译器已经自动帮你做了寄存器优化。
内容的提问来源于stack exchange,提问作者Schilive
相关产品推荐
相关产品推荐

