我需要研究类的构造函数如何初始化其对象。
关于构造函数行为的关键信息是:
如何编写代码:
提前致谢。
答案 0 :(得分:2)
获取构造函数地址的更好方法就是在new
周围编写一个包装器模板函数(使用C ++ 11完美转发,只需要一个)并获取该地址。
答案 1 :(得分:1)
- 给我构造函数的地址?
醇>
遗憾的是,这将是特定于平台的,需要使用汇编语言。您可以使用的基本技术是调用一个函数,该函数返回来自调用者的下一条指令的地址。从那里,您可以通过查看编译器生成的构造函数的汇编语言源代码,确定内存中构造函数代码的实际地址。我们的想法是查看调用函数的地址,然后从该地址中减去组成构造函数的任何先前命令所用的字节数。使用汇编语言源的要求是由于您无法从原始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()
时,返回的值将是函数调用完成后下一条指令(在汇编中)的值。使用在构造函数的汇编代码中进行函数调用的位置,然后允许您回溯并查看构造函数的起始地址的值是什么。