2011-04-16 48 views
2

我正在實施一個分析器。我想使用Constructor/Destructor成語來跟蹤我何時進入/退出函數。如何讓GCC實例化一個具有非平凡const/dest的類實例?

我的代碼粗線條如下:

class Profile 
{ 
    Profile(void); //Start timing 
    ~Profile(void); //Stop timer and log 
}; 
//... 
Game::Game(void) : m_Quit(false) 
{ 
    Profile p(); 
    InitalizeModules(); 
    //... 
} 

然而,當我運行它的構造函數和析構函數沒有被調用。即使在我反彙編時,也沒有對Profile :: Profile()的引用。我明白該標準指出具有不平凡構造函數的實例不能被編譯器優化。

編譯器或鏈接器的命令行上沒有優化標誌。

我也試過指定屬性((使用)),但無濟於事。

這裏是拆解:

(gdb) disassemble Ztk::Game::Game 
Dump of assembler code for function Ztk::Game::Game(): 
    0x00000000004cd798 <+0>:  push %rbp 
    0x00000000004cd799 <+1>:  mov %rsp,%rbp 
    0x00000000004cd79c <+4>:  push %r12 
    0x00000000004cd79e <+6>:  push %rbx 
    0x00000000004cd79f <+7>:  sub $0x30,%rsp 
    0x00000000004cd7a3 <+11>: mov %rdi,-0x38(%rbp) 
    0x00000000004cd7a7 <+15>: mov -0x38(%rbp),%rax 
    0x00000000004cd7ab <+19>: mov %rax,%rdi 
    0x00000000004cd7ae <+22>: callq 0x4cdc6a <Ztk::Highlander<Ztk::Game, int>::Highlander()> 
    /** CALL SHOULD BE HERE **/ 
    0x00000000004cd7b3 <+27>: mov -0x38(%rbp),%rax 
    0x00000000004cd7b7 <+31>: movb $0x0,(%rax) 
    0x00000000004cd7ba <+34>: callq 0x4e59f0 <Ztk::InitializeModules()> 

確實有生成的代碼,並鏈接到可執行文件

(gdb) disassemble Ztk::Profile::Profile(void) 
Dump of assembler code for function Ztk::Profile::Profile(): 
    0x0000000000536668 <+0>:  push %rbp 
    0x0000000000536669 <+1>:  mov %rsp,%rbp 
    0x000000000053666c <+4>:  sub $0x20,%rsp 
    0x0000000000536670 <+8>:  mov %rdi,-0x18(%rbp) 
    0x0000000000536674 <+12>: mov 0x8(%rbp),%rax 
    0x0000000000536678 <+16>: mov %rax,-0x8(%rbp) 
    0x000000000053667c <+20>: mov -0x8(%rbp),%rax 
    0x0000000000536680 <+24>: mov %rax,%rsi 
    0x0000000000536683 <+27>: mov $0x802440,%edi 
    0x0000000000536688 <+32>: callq 0x5363ca <Ztk::Profiler::FindNode(void*)> 
+0

如果目的是要找到瓶頸,很多人想這樣做,你要(登錄程序的入口/出口)的方式,但有一個更好的方法 - 疊採樣。 [這是一個解釋。](http://stackoverflow.com/questions/4387895/if-profiler-is-not-the-answer-what-other-choices-do-we-have/4390868#4390868)[放大] (http://www.rotateright.com/)是一個非常受尊敬的商業分析工具。這個概念可能是一個彎路,但其實很簡單。 – 2011-04-16 17:28:04

回答

8
Profile p(); 

你在這裏做什麼是聲明的函數,稱爲P,返回一個Profile類型的對象。你想要的是這樣的:

Profile p; 
+0

得愛C++最煩人的解析:) http://arstechnica.com/civis/viewtopic.php?f=20&t=767929 – Drahakar 2011-04-16 15:02:25

+0

哦!那一定是吧!我習慣於使用這個習慣用於構造參數的參數,當我回到我的GCC環境時,我會嘗試它。 – 2011-04-16 15:58:42