C语言中register关键字修饰变量的存储位置:堆、栈还是其他?
register修饰变量的存储位置说明 首先直接给结论:register修饰的变量既不属于堆,也不属于栈——因为寄存器是CPU自带的硬件存储单元,完全不在进程的虚拟内存空间范畴内。
不过要明确一个关键:register只是给编译器的建议,不是强制要求:
- 如果编译器觉得合适(比如寄存器有空闲、变量不需要被取地址),就会把变量放到CPU寄存器里,这时候它根本不会占用虚拟内存里的堆或栈空间。
- 如果寄存器资源紧张,或者你对这个变量使用了取地址操作(比如
&n),编译器会直接忽略register关键字,把变量当作普通的自动变量处理,这时候它就会存在栈上。
简单说:虚拟内存空间里找不到存放在寄存器里的register变量;只有当编译器不采纳register建议时,它才会出现在栈中,永远不会跑到堆里。
内容的提问来源于stack exchange,提问作者lafinur
相关产品推荐
相关产品推荐

