64,646
社区成员
发帖
与我相关
我的任务
分享
/****************
* tc1.cpp
*/
#include <iostream>
#include <stdio.h>
class Menu
{
public:
Menu():items_count(0), data(0){
printf("Menu()\n");
}
Menu(const char * file_name)
{
printf("Menu(const char *), p = %p\n", this);
items_count = 10;
data = 1;
}
virtual ~Menu(){
//~ printf("destory\n");
//~ printf("destroyed %p\n", this); // 如果在析构时用到了这个类实例的指针,那么编译器将不会把构造函数优化掉
}
public:
void dump()
{
printf("paras.data = %d\n", data);
printf("paras.items_count = %d\n", items_count);
}
protected:
int items_count;
int data;
};
class Paras
{
public:
Paras(){}
Paras(const Menu & menu)
{
m_pmenu = (Menu *)&menu;
}
protected:
Menu * m_pmenu;
public:
void dump(){
printf("m_menu = %p\n", m_pmenu);
m_pmenu->dump();
}
};
int main(int argc, char **argv)
{
Paras param(Menu("abc"));
param.dump();
return 0;
}
在上面的代码中,如果在编译时不做优化,那么Menu类实例可以正常初始化:
$ g++ -o tc1 tc1.cpp
$ ./tc1
====== 输出结果 ======
Menu(const char *), p = 0x7ffdded57060
m_menu = 0x7ffdded57060
paras.data =1
paras.items_count = 10
如果进行优化:
$ g++ -O2 -o tc1_opt tc1.cpp
$ ./tc1
====== 输出结果 ======
Menu(const char *), p = 0x7ffeef088100
m_menu = 0x7ffeef088100
paras.data = 0
paras.items_count = 0
通过反汇编,
$ objdump -d tc1 > tc1.S
$ objdump -d tc1_opt > tc1_opt.S
对比这两个.S文件可以发现,在未优化的代码中会包含Menu构造函数的具体实现:
4006db: 48 89 e6 mov %rsp,%rsi
4006de: bf 44 09 40 00 mov $0x400944,%edi
4006e3: 31 c0 xor %eax,%eax
4006e5: c7 44 24 08 0a 00 00 movl $0xa,0x8(%rsp)
4006ec: 00
4006ed: c7 44 24 0c 01 00 00 movl $0x1,0xc(%rsp)
而在-O2优化下,这部分代码不存在了。