繁体   English   中英

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

[英]Where is C++ constructor stored?

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

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

  1. 构造函数填充对象的vtable。
  2. 构造函数没有名称,因此没有函数指针。

我该如何编写代码:

  1. 给我构造函数的地址?
  2. 跟踪对象的初始化?

提前致谢。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM