编程嵌入式C开发者

你对C语言中的存储说明符'register'和'auto'有什么了解?它们的实际作用是什么?在现代代码中使用它们是否有意义?如果错误使用它们会导致哪些错误?

用 Hintsage AI 助手通过面试

答案

autoregister是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用于局部变量,认为这是一种良好的风格(参照其他语言)。这使代码变得杂乱,不影响行为,增加了阅读难度,并引起了同事的疑问。