Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++中登记存储说明符_C++_Cpu Registers - Fatal编程技术网

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++中, 变量声明的寄存

我很想知道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++中, 变量声明的寄存器在语义上与 未声明任何存储类说明符的变量


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

在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++中没有找到类似的冗长用法,我看不到相关性。语言进化的问题应该通过观察进化来回答。我编辑了一些内容,以强调选择旧标准的原因。