Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何让GCC用非平凡的const/dest实例化一个类实例?_C++_Optimization_Gcc_Constructor_Compiler Flags - Fatal编程技术网

C++ 如何让GCC用非平凡的const/dest实例化一个类实例?

C++ 如何让GCC用非平凡的const/dest实例化一个类实例?,c++,optimization,gcc,constructor,compiler-flags,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(); //... } 但是,当我运行它时,没有调用

我正在实现一个分析器。我想使用构造函数/析构函数习惯用法来跟踪我何时进入/退出函数

我的代码大致如下:

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)反汇编Ztk::Game::Game
函数Ztk::Game::Game()的汇编程序代码转储:
0x00000000004cd798:推送%rbp
0x00000000004cd799:mov%rsp,%rbp
0x00000000004cd79c:推送%r12
0x00000000004cd79e:推送%rbx
0x00000000004cd79f:子$0x30,%rsp
0x00000000004cd7a3:mov%rdi,-0x38(%rbp)
0x00000000004cd7a7:mov-0x38(%rbp),%rax
0x00000000004cd7ab:mov%rax,%rdi
0x00000000004cd7ae:callq 0x4cdc6a
/**电话应该在这里**/
0x00000000004cd7b3:mov-0x38(%rbp),%rax
0x00000000004cd7b7:movb$0x0,(%rax)
0x00000000004cd7ba:调用0x4e59f0
实际上,有代码生成并链接到可执行文件中

(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*)>
(gdb)反汇编Ztk::Profile::Profile(无效)
函数Ztk::Profile::Profile()的汇编程序代码转储:
0x00000000005366668:推送%rbp
0x000000000053669:mov%rsp,%rbp
0x00000000005366C:低于$0x20,%rsp
0x0000000000536670:mov%rdi,-0x18(%rbp)
0x0000000000536674:mov 0x8(%rbp),%rax
0x0000000000536678:mov%rax,-0x8(%rbp)
0x000000000053667c:mov-0x8(%rbp),%rax
0x0000000000536680:mov%rax,%rsi
0x0000000000536683:mov$0x802440,%edi
0x0000000000536688:callq 0x5363ca
您在这里所做的是声明一个名为p的函数,它返回一个Profile类型的对象。你想要的是:

Profile p;

爱C++最烦人的解析:哦!!!一定是这样!我习惯于将这个习惯用法用于设置参数的构造函数,当我回到我的GCC环境时,我会尝试使用它。如果对象要查找瓶颈,许多人希望按照您希望的方式(记录例程的进入/退出),但是有一种更好的方法-堆栈采样。是一位备受尊敬的商业分析人士。这个概念可能是一种思维扭曲,但实际上非常简单。
Profile p;