c++ - GCC 发出的 vtable 汇编代码中的那两个 long 是什么?

标签 c++ gcc assembly

我检查了 GCC 生成的汇编代码中的以下 C++ 代码片段。

class Interface {
public:
 virtual int f() = 0;
 virtual int g() = 0;
};

class Concrete : public Interface {
public:
 virtual int f();
 virtual int g();
};

每个vtable中有两个long,而汇编代码seams并没有使用它,那么这两个可行的目的是什么?

          .globl __ZTV8Concrete
          .const_data
          .align 3
  __ZTV8Concrete:
          .long   0   <<<< THOS TWO LONG DOESN"T USED.
          .long   0 
          .long   __ZN8Concrete1gEv
          .long   __ZN8Concrete1fEv
          .globl __ZTV9Interface
          .weak_definition __ZTV9Interface
          .section __DATA,__const_coal,coalesced
          .align 3
  __ZTV9Interface:
          .long   0    <<<< THOS TWO LONG DOESN"T USED ALSO.
          .long   0 
          .long   ___cxa_pure_virtual
          .long   ___cxa_pure_virtual
          .section __TEXT,__textcoal_nt,coalesced,pure_instructions
          .weak_definition        ___x86.get_pc_thunk.cx
          .private_extern ___x86.get_pc_thunk.

构造函数:

  __ZN8ConcreteC1Ev:
  LFB8:
          pushl   %ebp
  LCFI9:
          movl    %esp, %ebp
  LCFI10:
          pushl   %ebx
          subl    $20, %esp
  LCFI11:
          call    ___x86.get_pc_thunk.bx
  L2$pb:
          movl    8(%ebp), %eax
          movl    %eax, (%esp)
          call    __ZN9InterfaceC2Ev
          movl    8(%ebp), %edx
2>        leal    __ZTV8Concrete-L2$pb(%ebx), %eax
          leal    8(%eax), %eax    <<<< SKIP THE TWO 2 LONG for VTABLE
          movl    %eax, (%edx)
          addl    $20, %esp
          popl    %ebx

最佳答案

两个“空间”之一应该用于 RTTI(第二个),另一个用于多重继承(第一个)。例如,参见http://tinydrblog.appspot.com/?p=89001 ,甚至更好 https://stackoverflow.com/a/5712953/613130

关于c++ - GCC 发出的 vtable 汇编代码中的那两个 long 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18611121/

相关文章:

macos - 为什么我的程序集中的系统调用错误检查无法工作?

c++ - 禁止/重定向 C++ 删除?

c++ - 自定义流实用程序

c++ - 如何禁用另一个程序中的键?

c - gcc中pkg-config的意义是什么?

gcc - 使用 GCC 编译器为代码的特定部分保留寄存器

单独头文件中的 C++ 结构原型(prototype)

gcc - GCC 的 Xeon Phi Knights Corner 内在函数

assembly - 远近JMP

c++ - 并发使用中内联汇编的设计元素