簡體   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