有什么区别
int x=7;
Run Code Online (Sandbox Code Playgroud)
和
register int x=7;
Run Code Online (Sandbox Code Playgroud)
?
我正在使用C++.
Tom*_*Tom 92
register 是对编译器的提示,建议它将该变量存储在处理器寄存器而不是存储器中(例如,而不是堆栈).
编译器可能会也可能不会遵循该提示.
根据Herb Sutter的"不是关键词(或者,由另一个名字评论)":
寄存器说明符与自动说明符具有相同的语义...
sup*_*cat 17
在2010年存在的C++中,任何使用关键字"auto"或"register"的有效程序在语义上都与删除了这些关键字的程序相同(除非它们出现在字符串化的宏或其他类似的上下文中).从这个意义上说,关键字对于正确编译程序是无用的.另一方面,关键字在某些宏上下文中可能很有用,以确保宏的不正确使用会导致编译时错误,而不是产生伪代码.
在C++ 11及更高版本的语言中,auto关键字被重新用作初始化对象的伪类型,编译器将自动替换为初始化表达式的类型.因此,在C++ 03中,声明:auto int i=(unsigned char)5;等同int i=5;于在块上下文中使用时,并且auto i=(unsigned char)5;是违反约束的.在C++ 11中,auto int i=(unsigned char)5;成为一个约束违反,而auto i=(unsigned char)5;变得相当于auto unsigned char i=5;.
几乎肯定没什么.
register是您计划使用x很多的编译器的提示,并且您认为它应该放在寄存器中.
但是,编译器现在要更好地确定应该在寄存器中放置哪些值而不是普通(甚至是专家)程序员,因此编译器只是忽略关键字,并按照自己的意愿行事.
该register关键字对于:
生产系统的一个示例,其中register需要关键字:
typedef unsigned long long Out;
volatile Out out,tmp;
Out register rax asm("rax");
asm volatile("rdtsc":"=A"(rax));
out=out*tmp+rax;
Run Code Online (Sandbox Code Playgroud)
它已在C++ 17上弃用
| 归档时间: |
|
| 查看次数: |
81280 次 |
| 最近记录: |