auto和register是C语言中变量的存储说明符。
auto历史上表示具有函数/块作用域的自动变量。默认情况下,所有局部变量都是auto,所以通常没有必要明确写出。
register请求编译器将变量存储在处理器寄存器中以加快访问速度。但现代编译器会自行优化存储,通常忽略或最小响应这一请求。
另一方面,register类型的变量不能有地址(&var是禁止的)。
示例:
register int counter = 0; auto float sum = 0.0f;
可以声明指向register变量的指针吗?例如:
register int x = 5; int *p = &x;
不可以,无法获取register变量的地址——这将导致编译错误。register说明符禁止对变量进行取地址操作。
事件
在一个旧项目中,开发人员将register用于循环变量,然后试图将它们的地址传递给函数:foo(&i);。代码无法编译,要求去掉register说明符。错误仅在构建时被发现,延迟了重构。
事件
团队试图对一个较大尺寸的变量(例如结构体)使用register。编译器忽略了这一请求,并将变量存储在内存中,未能实现预期的性能提升,开发者长时间寻找性能下降的原因。
事件
在代码中大量使用auto用于局部变量,认为这是一种良好的风格(参照其他语言)。这使代码变得杂乱,不影响行为,增加了阅读难度,并引起了同事的疑问。