C ++构造函数存储在哪里?

时间:2012-08-11 05:18:12

标签: c++ visual-c++

我需要研究类的构造函数如何初始化其对象。

关于构造函数行为的关键信息是:

  1. 构造函数填充对象的vtable。
  2. 构造函数没有名称,因此没有函数指针。
  3. 如何编写代码:

    1. 告诉我构造函数的地址?
    2. 跟踪对象的初始化?
    3. 提前致谢。

2 个答案:

答案 0 :(得分:2)

获取构造函数地址的更好方法就是在new周围编写一个包装器模板函数(使用C ++ 11完美转发,只需要一个)并获取该地址。

答案 1 :(得分:1)

  
      
  1. 给我构造函数的地址?
  2.   

遗憾的是,这将是特定于平台的,需要使用汇编语言。您可以使用的基本技术是调用一个函数,该函数返回来自调用者的下一条指令的地址。从那里,您可以通过查看编译器生成的构造函数的汇编语言源代码,确定内存中构造函数代码的实际地址。我们的想法是查看调用函数的地址,然后从该地址中减去组成构造函数的任何先前命令所用的字节数。使用汇编语言源的要求是由于您无法从原始C ++代码确定machine-langage命令的内存占用量。如上所述,这将是高度平台和编译器特定的,因此是“非便携式”解决方案。

例如,在x86_64上,您可以执行以下操作来获取调用者中下一条指令的地址:

get_next_instruction_address.h

extern "C" unsigned long get_return_address();

get_next_instruction_address.S

.section .text

.global get_next_instruction_address

get_next_instruction_address:
    movq (%rsp), %rax
    ret

现在,当您调用get_next_instruction_address()时,返回的值将是函数调用完成后下一条指令(在汇编中)的值。使用在构造函数的汇编代码中进行函数调用的位置,然后允许您回溯并查看构造函数的起始地址的值是什么。