C++中登记存储说明符
我很想知道C/C++中寄存器存储说明符的行为。下面的程序在C++中有效,但是在C的情况下它无效。C++中登记存储说明符,c++,cpu-registers,C++,Cpu Registers,我很想知道C/C++中寄存器存储说明符的行为。下面的程序在C++中有效,但是在C的情况下它无效。 int main() { register int i; int* b = &i; // Valid in C++ but not in C } P> >我的问题I,为什么C++允许地址运算符和登记变量?< /P> 注:我知道现代编译器中不推荐使用寄存器存储说明符。您的答案可以在这里找到: 在C++中,登记变量的地址不能被取,但在C++中, 变量声明的寄存
int main()
{
register int i;
int* b = &i; // Valid in C++ but not in C
}
<> P> >我的问题I,为什么C++允许地址运算符和登记变量?< /P>
注:我知道现代编译器中不推荐使用寄存器存储说明符。您的答案可以在这里找到: 在C++中,登记变量的地址不能被取,但在C++中, 变量声明的寄存器在语义上与 未声明任何存储类说明符的变量
你的答案可以在这里找到: 在C++中,登记变量的地址不能被取,但在C++中, 变量声明的寄存器在语义上与 未声明任何存储类说明符的变量
在C语言标准化之前,P>C和C++是分叉的。两者都采用了register关键字,但只有C添加了对&运算符的限制 C++98标准在回顾历史时说 寄存器说明符与自动说明符具有相同的语义,并向实现提示这样声明的对象将被大量使用。[注意:提示可以忽略,在大多数实现中,如果对象的地址被获取,则提示将被忽略。-结束注意] 后来,它被弃用了,这与用语义限制来加强它相反。它计划在即将发布的C++17标准中删除
auto后来在C++11中重新调整了用途。它的旧含义与本地变量的默认存储相同。在C语言标准化之前, < P> C和C++是分叉的。两者都采用了register关键字,但只有C添加了对&运算符的限制 C++98标准在回顾历史时说 寄存器说明符与自动说明符具有相同的语义,并向实现提示这样声明的对象将被大量使用。[注意:提示可以忽略,在大多数实现中,如果对象的地址被获取,则提示将被忽略。-结束注意] 后来,它被弃用了,这与用语义限制来加强它相反。它计划在即将发布的C++17标准中删除 auto后来在C++11中重新调整了用途。它的旧含义与局部变量的默认存储相同 <> P> >我的问题I,为什么C++允许地址运算符和登记变量?< /P> 答案是: 因为C和C++是不同的语言,遵循不同的标准,如其他答案。 <> P> >我的问题I,为什么C++允许地址运算符和登记变量?< /P> 答案是:
因为C和C++是不同的语言,遵循不同的标准,如在其他答案中指出的。 < P>这一差别是由C++标准7.1.1存储类规范解释的。 3寄存器规范是对实现的一种提示,即 这样声明的变量将被大量使用。[注意:提示可以是 忽略,在大多数实现中,如果 已获取变量的地址。不推荐使用此用法。请参阅D.2。 -[完注]
<>这个差异是由C++标准7.1.1存储类规范< /P>解释的。 3寄存器规范是对实现的一种提示,即 这样声明的变量将被大量使用。[注意:提示可以是 忽略,在大多数实现中,如果 已获取变量的地址。不推荐使用此用法。请参阅D.2。 -[完注]
它建议编译器将变量放入寄存器,因为程序员希望更快地访问该变量。但是它并没有强制它。你为什么添加C++标签来解决C++问题?他们是不同的语言!这是一个很无聊的答案,但是因为C++标准这么说。它说register关键字是对实现的一个提示,即这样声明的变量将被大量使用,并且在大多数实现中,如果采用了变量的地址,则会被忽略。@Olaf OP实际上会问为什么会有不同。嗯,这是不同的语言,这就是为什么。@Olaf我用OPs语句回复了一条现在被删除的评论,因为它回答了有问题的评论。我不知道你在回答什么,它建议编译器将变量放入寄存器,因为程序员希望更快地访问这个变量。但是它并没有强制它。你为什么添加C++标签来解决C++问题?他们是不同的语言!这是一个很无聊的答案,但是因为C++标准这么说。它说register关键字是对实现的一个提示,即这样声明的变量将被大量使用,并且在大多数实现中,如果采用了变量的地址,则会被忽略。@Olaf OP实际上会问为什么会有不同。嗯,这些是
不同的语言,这就是为什么。@Olaf我用OPs语句回复一条现在已删除的评论,因为它回答了有问题的评论。我不知道你在回答什么。注意:C++ 98不是标准C++。这将是C++14。最好引用有效的标准,即使它说的是相同的。@Olaf旧标准仍然是标准和有效的,只是旧的。我选择了旧标准,因为这是一个历史问题。@potatosatter实际上最新的标准凌驾于所有其他标准之上。因为问题是用C++ +版本来标记的,所以在编写时应该引用标准。@ PATATOSWATER:标准的旧版本在发布新版本时被明确取消。所以不,它们不是有效的标准。我建议阅读标准的前言。对于C++来说,你肯定会找到标准。@奥拉夫,我在C++中没有找到类似的冗长用法,我看不到相关性。语言进化的问题应该通过观察进化来回答。我已经编辑了一点,强调为什么选择旧的标准。注意:C++ 98不是标准C++。这将是C++14。最好引用有效的标准,即使它说的是相同的。@Olaf旧标准仍然是标准和有效的,只是旧的。我选择了旧标准,因为这是一个历史问题。@potatosatter实际上最新的标准凌驾于所有其他标准之上。因为问题是用C++ +版本来标记的,所以在编写时应该引用标准。@ PATATOSWATER:标准的旧版本在发布新版本时被明确取消。所以不,它们不是有效的标准。我建议阅读标准的前言。对于C++来说,你肯定会找到标准。@奥拉夫,我在C++中没有找到类似的冗长用法,我看不到相关性。语言进化的问题应该通过观察进化来回答。我编辑了一些内容,以强调选择旧标准的原因。