我实际上是否将对象存储在这里的 cpu 寄存器中
Am I actually storing the object in the cpu register here?
在这个程序中,我使用的是易失寄存器对象,我实际上是否将我的对象存储到此处的寄存器中?
为什么我得到对象的地址为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 中弃用,也不是必需的。如果您使用的是编译器,则向旧标准确认寄存器存储只是对编译器的请求,编译器可以自由忽略它,尤其是当您需要对象的地址时。
- 本质:使用__128寄存器
- 将寄存器设计成可由C和C++访问的外设的最佳实践
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 使用英特尔 PIN 修改寄存器
- AVX 指令中寄存器和指针之间的客观差异
- 如何确定我的处理器有多少个 AVX 寄存器?
- 除非使用某些寄存器,否则函数挂钩会崩溃
- 寄存器上的管道计算
- 其中关于内存和寄存器的左值和右值
- 有没有办法强制C++编译器将变量存储在寄存器中?
- "变量":函数中函数作用域不允许初始化的自动或寄存器变量'naked'
- CPU寄存器中返回的用户定义类型的C 对象.实例方法如何工作
- 在Windows中访问英特尔CPU I/O寄存器的简便方法
- 为什么没有对CPU's状态寄存器在C和C++设计中的应用
- 如何使用我的cpu的MM0到MM7寄存器
- 崩溃报告中的CPU寄存器地址在分析中如何有用
- 在调试期间显示cpu缓存和寄存器内容
- 模拟CPU寄存器
- 我实际上是否将对象存储在这里的 cpu 寄存器中
- 如何加载(mov)类变量到CPU寄存器