我实际上是否将对象存储在这里的 cpu 寄存器中

Am I actually storing the object in the cpu register here?

本文关键字:cpu 寄存器 在这里 存储 实际上 是否 对象      更新时间:2023-10-16

在这个程序中,我使用的是易失寄存器对象,我实际上是否将我的对象存储到此处的寄存器中?
为什么我得到对象的地址为1?请分享你对此的想法。

#include <iostream>
using namespace std;

class a{
    int i,j,k[999];
    long double  arr[9999999];
    public:
        a(){
            i=77; j=89;
            cout<<"nctorn";
        }
        void disp()volatile {
            cout<<"ni = "<<i<<" j = "<<j<<"n";
        //  delete this;
        }
        ~a(){
            cout<<"ndtorn";
        }
};

int main(){
    register volatile a *ao = new a;
    cout<<"address of a = "<<ao; //out puts "1" for me; (My processor is core i3 330M).
    ao->disp();
     delete ao;
}

这很明显,因为没有任何东西调用删除,这意味着你会得到内存泄漏。您需要显式调用 delete 以避免这种情况,甚至更好:使用智能指针。

此外,寄存器将在C++中被忽略。它基本上已被弃用。您可以从C++标准中读取它:

寄存器说明符具有与自动说明符相同的语义,并提示实现如此声明的对象将被大量使用。[注意:提示可以忽略,在大多数实现中,如果获取对象的地址,它将被忽略。

因此,这里的寄存器用法是红鲱鱼。

打印的 1 是因为以下原因:

"当你传入一个易失性指针时,第二个重载不能应用,因为如果没有显式强制转换,易失性指针无法转换为非易失性指针。但是,任何指针都可以转换为布尔值,因此选择第一个重载,您看到的结果是 1 或 0。

。从这里。

因此,如果您去除挥发物,它将不再打印1

我的想法:在这里,您可能试图通过使用 volatile 关键字来拒绝对指针对象ao的编译器进行优化,我说得对吗?但这是你得到"1"的唯一原因!C++标准说,即使您将对象或变量指定为 register,它也只会在内部视为auto。有关输出1的详细信息,请参阅此链接

您正在动态内存中构造对象。您需要通过调用"删除ao"来手动清理此问题。这不会自动为您完成。如果以某种方式 ao 超出了范围,并且您无法访问指向此对象的指针,那么您就有了所谓的"内存泄漏",这是许多C++程序员的主要痛点。

注册关键字已在 C++ 11 中弃用,也不是必需的。如果您使用的是编译器,则向旧标准确认寄存器存储只是对编译器的请求,编译器可以自由忽略它,尤其是当您需要对象的地址时。