为何部分编译器不支持用register数组简化初始化代码?
为什么Clang 13/GCC 13不支持register数组的写法?
先明确C标准的核心规则:
register关键字的作用是提示编译器把变量放到寄存器里,而寄存器没有内存地址,所以标准明确规定不能获取register变量的地址(也就是不能用&操作符)。数组遍历的本质:不管你用下标
arr[i]还是指针方式遍历数组,底层都是在操作元素的内存地址——这就直接违反了register变量不能取地址的规则。Clang 12能编译的原因:早期版本的Clang对
register关键字的检查比较宽松。其实现在多数编译器已经忽略register(因为编译器优化器比手动指定更靠谱),但Clang 12可能直接跳过了对register数组的地址检查,把它当成普通数组处理了。Clang 13/GCC 13报错的原因:这两个新版本编译器严格遵循了C标准的要求,只要你用
register修饰数组,数组的每个元素都会被视为register变量,而遍历数组必然涉及取地址操作,所以直接触发错误提示。
额外提一句:现在完全没必要手动用register关键字,现代编译器的优化器会自动把频繁使用的变量放到寄存器中,手动指定反而容易引发这类兼容性问题。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

