如何使GCC实例化一个具有非平凡const/dest的类实例?

Ram*_* B. 2 c++ optimization gcc constructor compiler-flags

我正在实施一个分析器.我想使用构造函数/析构函数来跟踪我何时进入/退出函数.

我的代码粗略概述如下:

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

但是,当我运行它时,不会调用构造函数和析构函数.即使我反汇编,也没有对Profile :: Profile()的引用.我知道该标准指定编译器无法优化具有非平凡构造函数的实例.

编译器或链接器的命令行上没有优化标志.

我也试过指定属性((used)),但无济于事.

这是反汇编:

(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()>
Run Code Online (Sandbox Code Playgroud)

确实有代码生成并链接到可执行文件中

(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*)>
Run Code Online (Sandbox Code Playgroud)

Ben*_*ley 8

Profile p();
Run Code Online (Sandbox Code Playgroud)

你在这里所做的是声明一个名为p的函数,它返回一个Profile类型的对象.你想要的是这个:

Profile p;
Run Code Online (Sandbox Code Playgroud)