gpt4 book ai didi

c++ - C和C++中寄存器变量的地址

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:26 25 4
gpt4 key购买 nike

我知道寄存器变量的概念及其用例,但根据我的尝试,我脑子里几乎没有问题。

  1. 我不能访问 C 中寄存器变量的地址,尽管我可以使用 C++!为什么?访问寄存器变量的寻址有什么问题吗?

  2. 假设如果我在 C++ 中将一个字符串变量声明为寄存器,那么该变量将存储在哪里? C++中'string'等非数字数据类型的存储类声明为register有什么意义?

更新:我认为 C++ 允许我们获取寄存器变量的地址,因为我的程序中没有出现任何错误,如下所示:

#include<iostream>
#include<time.h>

using namespace std;

clock_t beg, en;

int main(){

int j, k=0;

beg=clock();
for(register int i=0;i<10000000;i++){
/*if(k==0){
cout<<&i<<endl; // if this code is uncommented, then C++ rejects the recommendation to make 'i' as register
k++;
}*/
}
en=clock();

cout<<en-beg<<endl;

cout<<&j<<endl<<&k;

return 0;
}

我观察到的是,如果我将变量“i”作为寄存器并且不尝试使用“&i”打印地址,那么 C++ 接受建议并将“i”存储在寄存器中,这可以从中推断出来如果'i'在寄存器中,for循环的运行时间将始终在4-12毫秒左右。但是,如果我尝试打印变量“i”的地址,那么虽然我没有收到任何错误,但 C++ 拒绝了建议,这可以从循环执行时间推断出来,如果我没有注册,它总是超过 25! !

所以,基本上我无法在 C 和 C++ 中获取存储类作为寄存器的变量的地址!为什么?

最佳答案

C 和 C++ 是不同的语言。

  • 在 C 中,您不能使用 register 存储获取变量的地址。比照。 C11 6.7.1/6:

    A declaration of an identifier for an object with storage-class specifier register suggests that access to the object be as fast as possible. The extent to which such suggestions are effective is implementation-defined.

    Footnote: The implementation may treat any register declaration simply as an auto declaration. [...]

  • 在 C++ 中,register 是一个已弃用的无意义关键字,它没有任何作用(除了可能用作编译器提示),声明为 register 的变量仍然只是有自动存储。特别是,C++ 没有“注册”存储类。 (它只是具有存储类 specifier,继承自 C。)Cf。 C++11、7.1.1/3:

    A register specifier is a hint to the implementation that the variable so declared will be heavily used. [ Note: The hint can be ignored and in most implementations it will be ignored if the address of the variable is taken. This use is deprecated [...]

即使在 C 中,实际上也无法保证如何实现寄存器存储(实现可以自由地将 register 视为 auto),但语言规则无论如何都适用。

关于c++ - C和C++中寄存器变量的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com