繁体   English   中英

在C ++中注册存储说明符

[英]Register storage specifier in C++

我很好奇知道C/C++register存储说明符的行为。 以下程序在C++有效,但在C情况下无效。

int main()
{
        register int i;
        int* b = &i; // Valid in C++ but not in C
}

那么,我的问题我, 为什么C ++允许地址运算符(&)到寄存器变量?

PS:我知道寄存器存储说明符在现代编译器中已弃用。

您的答案可以在这里找到:

http://en.cppreference.com/w/cpp/language/storage_duration

在C语言中,不能获取寄存器变量的地址,但是在C ++语言中,声明为register的变量与没有任何存储类说明符的声明变量在语义上没有区别。

在C语言标准化之前,C和C ++有所分歧。 两者都使用了register关键字,但是只有C添加了对&运算符的限制。

回顾历史,C ++ 98标准说,

register说明符与auto说明符具有相同的语义,并带有实现的提示,即声明的对象将大量使用。 [ 注意:提示可以忽略,在大多数实现中,如果使用对象的地址,则将忽略提示。 尾注 ]

随后不推荐使用,这与通过语义限制进行增强相反。 计划在即将发布的C ++ 17标准中将其删除。

auto后来在C ++ 11中被重新利用。它的旧含义与局部变量的默认存储相同。)

那么,我的问题我, 为什么C ++允许地址运算符(&)到寄存器变量?

答案是:
因为C和C ++是不同的语言,并且遵循其他答案中指出的不同标准。

区别在于C ++标准(7.1.1存储类规范)中的引号

3寄存器说明是实现的暗示,即声明的变量将被大量使用。 [注意:提示可以忽略, 在大多数实现中,如果采用变量的地址,则将忽略提示。 不建议使用此用法(请参阅D.2)。 —尾注]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM