有什么区别
int x=7;
Run Code Online (Sandbox Code Playgroud)
和
register int x=7;
Run Code Online (Sandbox Code Playgroud)
?
我正在使用C++.
在求职面试中,我被问到"在C++中如何更快地访问变量,尽管是正常的变量标识符或通过指针".我必须说我对这个问题没有很好的技术答案,所以我做了一个疯狂的猜测.
我说访问时间可能与普通变量相同/标识符是指向存储值的内存地址的指针,就像指针一样.换句话说,就速度而言,它们都具有相同的性能,并且指针只是不同,因为我们可以指定我们希望它们指向的内存地址.
面试官似乎对我的回答并不十分信服/满意(虽然他没有说什么,只是继续问别的东西),因此我来问问他们,我的回答是准确的,如果不是为什么(来自理论和技术POV).
在阅读Herb Sutter撰写的关键词(或其他名称)时,我遇到了以下几点:
没错,有些关键字在语义上等同于空格,这是一个美化的评论.
和
我们已经看到为什么C++语言将关键字视为保留字,我们已经看到两个关键字-auto和register--它们对C++程序没有任何语义差异.不要使用它们; 无论如何,它们只是空格,并且有更快的方式来输入空格.
如果关键字auto(可能不是在C++ 11中)并且register没有价值,那么它们为什么被创建和使用?
如果包含register变量之前没有任何区别
#include<stdio.h>
int main(){
register int a = 15;
printf("%d\n%d\n",&a,a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么上述程序会出错?
test_register.c:在函数'main'中:
test_register.c:4:2:错误:请求的寄存器变量'a'的地址
的printf( "%d \n%d \n",&A,A);
以下程序适用于C++.
#include<iostream>
int main(){
register int a = 15;
std::cout<<&a<<'\n'<<a;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我刚才知道我们可以在C++程序中明确地使用寄存器.我想知道如果我在一个C++程序中声明并使用所有可用的寄存器并运行它相当长的时间.我的系统行为有多糟糕,操作系统将采取什么(如果有的话)措施来摆脱这种情况.
void
usage (cpp)
register const char *const *cpp;
{
(void) fprintf (stderr, *cpp++, program_name, cvs_cmd_name);
for (; *cpp; cpp++)
(void) fprintf (stderr, *cpp);
error_exit ();
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么 register 变量不在大括号内,fprintf 前面的这个 (void) 是什么?还要注册 const char *const *cpp,我以前从未见过这样的事情
我试图了解我应该如何const在C代码中使用.首先,我并没有真正使用它,但后来我看到了很多const在整个过程中使用的例子.我应该努力并回去并虔诚地制作合适的变量const吗?或者我只是在等我的时间?
我想它可以更容易地读取预期会发生变化的变量,特别是在函数调用中,对于人类和编译器.我错过了其他重要的观点吗?
我应该在我的phone变量上使用register关键字吗?我有这个:
void *anything(Caller *caller)
{
register void *phone = caller->phone;
/* or this */
void *phone = caller->phone;
if (phone)
{
return phone;
}
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
有区别吗?我该怎么办?
这是代码,
char *foo()
{
static char s[10] = "abcde";
return s;
}
char *bar()
{
char *c = foo();
return c;
}
int main()
{
printf("%s\n", bar());
}
Run Code Online (Sandbox Code Playgroud)
通常情况下,这是错误的,因为我的确在返回一个局部指针bar,但现在c指向一个static变种返回的foo,这将是正确的,返回一个局部变量c的bar?
我试过,这printf是正确的价值,但我不明白它是如何工作的.我想,当bar()完成时,var c应该消失,这应该是printf打印未定义的东西,对吧?
跟进
char *c是一个局部变量,如果char *c = "abcde";,我认为这一点:c是驻留在函数的堆栈一个局部变量,同时"abcde"是一个常数变种驻留在常量区(堆的一部分吗?),所以当bar()完成,c消失,但"abcde"仍还在堆里,对吗?
我们知道用寄存器存储类声明的变量的地址是不能取的。所以我尝试用 register 关键字创建一个数组并尝试访问元素。但我注意到编译器没有引发任何错误。
#include <stdio.h>
void main()
{
register int x[]={3,4};
printf("%d\n",x[0]); // compiled successfully
// printf("%d",&x[0]);// compiler raises an error
}
Run Code Online (Sandbox Code Playgroud)
众所周知,编译器将表达式 x[0] 转换为 *(x+0),其中 x 表示基地址。但是怎么可能得到数组的基地址,因为它是用寄存器存储类声明的?
提前致谢..