因为我知道在C中我们可以使用关键字“register”来向编译器建议变量应该存储在CPU寄存器中。涉及CPU指令的所有变量最终都将存储在CPU寄存器中以便执行,这是不是真的?为什么我们需要建议一个变量存储在寄存器中?
回答
register
关键字是一种告诉编译器该变量被大量使用的方式。确实,通常必须将值暂时加载到寄存器中以对其执行计算。这个名字来源于这样一种想法,即编译器可能会将变量保存在寄存器中的整个持续时间范围内,而不是只在临时用于计算时。
由于现代编译器可以在程序员没有帮助的情况下确定何时大量使用变量(以及何时不使用其地址),因此该关键字已过时用于优化。
如何确定范围的“持续时间”? C中的块? – woongiap 2010-09-30 07:54:36
编译器确定您的持续时间 - 优化后可能少于或多于源代码块/范围。如果该值未在范围的后半部分使用,并且内存/寄存器可以有效地用于其他内容,则更少;如果该值以某种方式返回到当前块之外,并且出于效率原因应该保持活动状态当前范围。 – 2010-09-30 08:06:21
-1:关键字不会过时。不幸的是,现在它与目标机器的寄存器没有多大关系,但唯一的含义是你不能获取该变量的地址。这可以是一个宝贵的优化提示,并且在安全性方面也很重要。它阻碍了你无意中暴露了堆栈变量的地址。 – 2010-09-30 08:30:50
在过去,编译器并不像现在这样聪明。这是编程人员向编译器提示的,该变量应存储在寄存器中,以便快速访问/修改。今天,几乎所有体面的编译器都实现了聪明的寄存器分配算法,它们击败了人类的头脑。
您应该不是使用register
关键字。这是一个古老的遗物,保持向后兼容性。大多数编译器都会忽略它(默认情况下)。
可能有例外,但它们非常罕见,请查阅您的编译器手册。
是不是所有涉及CPU指令的变量最终都会存储在CPU寄存器中执行?
是的,的确如此。但是CPU寄存器是有限的,所以变量通常从'普通'存储器加载/存储,并且只是简单地存在于寄存器中。 register
关键字是(是)指示应该占用更长寄存器的高优先级变量的一种方式。像for(i = 0; ...)
中的i
一样。
大多数变量将加载进入寄存器很短的时间...只要有必要做什么需要与他们做什么。 register
关键字暗示他们应该在那里保留。
虽然编译器的优化已经变得非常好,但register
关键字并不是很有帮助。事实上,如果你的编译器根本不尊重它(甚至不这样做),它甚至会让你感到困惑(通过捆绑编译器的手,使某些优化成为不可能)。所以现在这是一个非常糟糕的主意。
感谢您的回答,只是caf是第一个提供正确答案的人 – woongiap 2010-09-30 08:22:22
- 1. 为什么编译器将变量存储在寄存器中?
- 2. 为什么建立普通布尔MRSW寄存器需要2个寄存器?
- 3. 存储字节在寄存器变量
- 4. 为什么我们需要创建一个中断向量表?
- 5. 为什么我们在创建存储库时需要创建xxxCustom和xxxImpl类?
- 6. 当我们已经有程序计数器寄存器时,为什么我们需要一个堆栈指针寄存器?
- 7. 为什么我们需要在编译器中分配存储空间
- 8. 一个变量应该存储在一个寄存器中多久?
- 9. 为什么我们需要使用存储过程?
- 10. 为什么我们需要瞬态故障处理存储?
- 11. 存储库模式 - 为什么我们需要接口?
- 12. 是什么存储“存储变量所需的内存”的变量和要求的规格有什么区别?
- 13. 为什么我需要在我的settings.xml文件中指定一个存储库
- 14. 访问一个SSE寄存器变量
- 15. 为什么值被存储在寄存器0x605040c,而不是12?
- 16. 在CPU寄存器中分配寄存器变量的标准?
- 17. 为什么我们需要创建存储过程进行备份?
- 18. AVR在C - 存储变量中的寄存器值
- 19. 将变量存储在CPU寄存器中
- 20. 存储在寄存器中的变量的地址
- 21. 需要一个php缓存建议
- 22. 我是编程新手,需要将以下输入存储在一个数组中。有什么建议么?
- 23. 为什么LLVM需要一个新的临时寄存器标识符
- 24. 什么是线程本地存储?我们为什么需要它?
- 25. 为什么在maven中需要镜像,而我们可以修改存储库?
- 26. 我们为什么需要将会话存储在数据库中?
- 27. 在FPGA中需要大量存储器
- 28. 为什么只有四个寄存器?
- 29. 是什么使一个值不安全的存储在寄存器中?
- 30. 为什么我们在抽象类存在时需要接口?
这个相关的问题可能会有帮助:[“在C中注册关键字?](http://stackoverflow.com/questions/578202/register-keyword-in-c) – 2010-09-30 07:46:59