相关疑难解决方法(0)

81
推荐指数
7
解决办法
8万
查看次数

指针与C++中的可变速度

在求职面试中,我被问到"在C++中如何更快地访问变量,尽管是正常的变量标识符或通过指针".我必须说我对这个问题没有很好的技术答案,所以我做了一个疯狂的猜测.

我说访问时间可能与普通变量相同/标识符是指向存储值的内存地址的指针,就像指针一样.换句话说,就速度而言,它们都具有相同的性能,并且指针只是不同,因为我们可以指定我们希望它们指向的内存地址.

面试官似乎对我的回答并不十分信服/满意(虽然他没有说什么,只是继续问别的东西),因此我来问问他们,我的回答是准确的,如果不是为什么(来自理论和技术POV).

c++ variables performance pointers

44
推荐指数
4
解决办法
2万
查看次数

为什么创建了register关键字?

在阅读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++ language-lawyer c++11

44
推荐指数
3
解决办法
7265
查看次数

在C++中使用寄存器变量可以做多少坏事

我刚才知道我们可以在C++程序中明确地使用寄存器.我想知道如果我在一个C++程序中声明并使用所有可用的寄存器并运行它相当长的时间.我的系统行为有多糟糕,操作系统将采取什么(如果有的话)措施来摆脱这种情况.

c++ linux memory

20
推荐指数
5
解决办法
1950
查看次数

什么注册 const char *const *name; 意思是为什么这个变量在函数之外?

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,我以前从未见过这样的事情

c

10
推荐指数
2
解决办法
241
查看次数

如何在C中最好地使用const关键字?

我试图了解我应该如何const在C代码中使用.首先,我并没有真正使用它,但后来我看到了很多const在整个过程中使用的例子.我应该努力并回去并虔诚地制作合适的变量const吗?或者我只是在等我的时间?

我想它可以更容易地读取预期会发生变化的变量,特别是在函数调用中,对于人类和编译器.我错过了其他重要的观点吗?

c const

8
推荐指数
2
解决办法
8552
查看次数

我应该在我的代码中使用register关键字吗?

我应该在我的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)

有区别吗?我该怎么办?

c

6
推荐指数
2
解决办法
1383
查看次数

返回一个指向静态变量的本地指针

这是代码,

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,这将是正确的,返回一个局部变量cbar

我试过,这printf是正确的价值,但我不明白它是如何工作的.我想,当bar()完成时,var c应该消失,这应该是printf打印未定义的东西,对吧?

跟进

char *c是一个局部变量,如果char *c = "abcde";,我认为这一点:c是驻留在函数的堆栈一个局部变量,同时"abcde"是一个常数变种驻留在常量区(堆的一部分吗?),所以当bar()完成,c消失,但"abcde"仍还在堆里,对吗?

c static

6
推荐指数
1
解决办法
2312
查看次数

与register关键字相关的其他语义

不推荐使用 register关键字,大多数都忽略了它.

但是这篇关于msdn的文档的一小部分让我很奇怪.

编译器不接受用户对寄存器变量的请求; [...]但是,与register关键字相关的所有其他语义都得到了尊重.

那些其他语义是什么?

c c++ msdn

6
推荐指数
1
解决办法
114
查看次数

如何使用 C 中的寄存器存储类创建数组?

我们知道用寄存器存储类声明的变量的地址是不能取的。所以我尝试用 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 表示基地址。但是怎么可能得到数组的基地址,因为它是用寄存器存储类声明的?

提前致谢..

c arrays gcc register-keyword

6
推荐指数
1
解决办法
78
查看次数