小编Ant*_*cic的帖子

处理器如何处理未初始化的变量?

所以我有一个分配,我基本上必须在汇编中弄清楚变量是如何存储的,而且我在弄清楚 C++ 如何处理各种变量时遇到了问题。

MyClass var;
MyClass *p = new MyClass();
var.setX(3)
Run Code Online (Sandbox Code Playgroud)

我想我发现的是: *p 引用被存储在堆栈上,而创建的对象被分配在堆上。这意味着 p 正在引用创建的对象。请确认是否正确。

问题是var会发生什么,它是动态分配的吗?我正在查看程序集,但找不到任何可以指向我答案的内容。

c++ assembly

0
推荐指数
1
解决办法
105
查看次数

子类中的虚函数表是如何生成的

所以我知道在 C++ 中,虚拟方法适用于存储在表中的每个类,并且每个实例都有一个指向该表的指针。所以我的问题是子类表是什么样的。我将提供一个汇编指令:

vtable for Derived:
    .long   0
    .long   _typeinfo for Derived
    .long   _Derived::set()
    .globl  _vtable for Base
    .section    .rdata$vtable for Base,"dr"
    .linkonce same_size
    .align 4
Run Code Online (Sandbox Code Playgroud)

因此,从这里我可以看到 Derived 有一个虚拟方法set(),但令我烦恼的部分是 Base 的 vtable。Derived vptr 是否保存指向 Base vptr 的指针,还是存储在 Derived 的 vtable 内。我注意到,在代码中,编译器仅将 vtable 存储在对象的 0 地址处,一次存储在 Base 构造函数中,一次存储在 Derived 中。为什么vtable没有被覆盖?

PS我不太明白指令

编辑:

class Base{
   virtual void print() {
       printf("Base");
   }
}

class Derived : Base{
   virtual void print(){
       printf("Derived");
   }
}
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism assembly vtable

0
推荐指数
1
解决办法
723
查看次数

标签 统计

assembly ×2

c++ ×2

polymorphism ×1

vtable ×1