免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3344 | 回复: 10
打印 上一主题 下一主题

[C++] about g++ compiler [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-28 12:01 |只看该作者 |倒序浏览
测试代码:
class A {
public:
    A();
    A(int _i);
    ~A();
    void hello();
    
private:
    int i;
};

A::A()
{
    i = 0;
}

A::A(int _i)
{
    i = _i;
}

A::~A()
{
    i = 2;
}

void A::hello()
{
    i = 1;
}


用g++ 4.3.2编译后,生成的汇编代码如下:
00000000 <A::A()>:
&nbsp;&nbsp;&nbsp;0:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;&nbsp;1:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;&nbsp;3:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%eax
&nbsp;&nbsp;&nbsp;6:&nbsp;&nbsp;&nbsp;&nbsp;c7 00 00 00 00 00    &nbsp;&nbsp;&nbsp;&nbsp;movl   $0x0,(%eax)
&nbsp;&nbsp;&nbsp;c:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;&nbsp;d:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   

0000000e <A::A()>:
&nbsp;&nbsp;&nbsp;e:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;&nbsp;f:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;11:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%eax
&nbsp;&nbsp;14:&nbsp;&nbsp;&nbsp;&nbsp;c7 00 00 00 00 00    &nbsp;&nbsp;&nbsp;&nbsp;movl   $0x0,(%eax)
&nbsp;&nbsp;1a:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;1b:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   

0000001c <A::A(int)>:
&nbsp;&nbsp;1c:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;1d:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;1f:&nbsp;&nbsp;&nbsp;&nbsp;8b 55 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%edx
&nbsp;&nbsp;22:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 0c             &nbsp;&nbsp;&nbsp;&nbsp;mov    0xc(%ebp),%eax
&nbsp;&nbsp;25:&nbsp;&nbsp;&nbsp;&nbsp;89 02                &nbsp;&nbsp;&nbsp;&nbsp;mov    %eax,(%edx)
&nbsp;&nbsp;27:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;28:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   
&nbsp;&nbsp;29:&nbsp;&nbsp;&nbsp;&nbsp;90                   &nbsp;&nbsp;&nbsp;&nbsp;nop   

0000002a <A::A(int)>:
&nbsp;&nbsp;2a:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;2b:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;2d:&nbsp;&nbsp;&nbsp;&nbsp;8b 55 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%edx
&nbsp;&nbsp;30:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 0c             &nbsp;&nbsp;&nbsp;&nbsp;mov    0xc(%ebp),%eax
&nbsp;&nbsp;33:&nbsp;&nbsp;&nbsp;&nbsp;89 02                &nbsp;&nbsp;&nbsp;&nbsp;mov    %eax,(%edx)
&nbsp;&nbsp;35:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;36:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   
&nbsp;&nbsp;37:&nbsp;&nbsp;&nbsp;&nbsp;90                   &nbsp;&nbsp;&nbsp;&nbsp;nop   

00000038 <A::~A()>:
&nbsp;&nbsp;38:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;39:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;3b:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%eax
&nbsp;&nbsp;3e:&nbsp;&nbsp;&nbsp;&nbsp;c7 00 02 00 00 00    &nbsp;&nbsp;&nbsp;&nbsp;movl   $0x2,(%eax)
&nbsp;&nbsp;44:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;45:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   

00000046 <A::~A()>:
&nbsp;&nbsp;46:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;47:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;49:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%eax
&nbsp;&nbsp;4c:&nbsp;&nbsp;&nbsp;&nbsp;c7 00 02 00 00 00    &nbsp;&nbsp;&nbsp;&nbsp;movl   $0x2,(%eax)
&nbsp;&nbsp;52:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;53:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   

00000054 <A::hello()>:
&nbsp;&nbsp;54:&nbsp;&nbsp;&nbsp;&nbsp;55                   &nbsp;&nbsp;&nbsp;&nbsp;push   %ebp
&nbsp;&nbsp;55:&nbsp;&nbsp;&nbsp;&nbsp;89 e5                &nbsp;&nbsp;&nbsp;&nbsp;mov    %esp,%ebp
&nbsp;&nbsp;57:&nbsp;&nbsp;&nbsp;&nbsp;8b 45 08             &nbsp;&nbsp;&nbsp;&nbsp;mov    0x8(%ebp),%eax
&nbsp;&nbsp;5a:&nbsp;&nbsp;&nbsp;&nbsp;c7 00 01 00 00 00    &nbsp;&nbsp;&nbsp;&nbsp;movl   $0x1,(%eax)
&nbsp;&nbsp;60:&nbsp;&nbsp;&nbsp;&nbsp;5d                   &nbsp;&nbsp;&nbsp;&nbsp;pop    %ebp
&nbsp;&nbsp;61:&nbsp;&nbsp;&nbsp;&nbsp;c3                   &nbsp;&nbsp;&nbsp;&nbsp;ret   


为什么类A的构造函数和析构函数,其汇编代码有两份完全相同的拷贝?

论坛徽章:
0
2 [报告]
发表于 2008-09-28 15:23 |只看该作者
确实挺奇怪的,以前还从来没有注意到这个。3.4编译结果也是如此。

论坛徽章:
0
3 [报告]
发表于 2008-09-28 15:30 |只看该作者
好像是bug, 给gcc开发组提个bug吧,同时可以让他们排查下到底是不是问题

论坛徽章:
0
4 [报告]
发表于 2008-09-28 15:50 |只看该作者

回复 #3 ytl 的帖子

应该有一些特殊原因吧,如果是Bug不可能从3.x到4.x一直这样吧。

论坛徽章:
0
5 [报告]
发表于 2008-09-28 16:00 |只看该作者
原帖由 Cyberman.Wu 于 2008-9-28 15:50 发表
应该有一些特殊原因吧,如果是Bug不可能从3.x到4.x一直这样吧。


想不出来有什么理由这样做
给gcc开发组提吧,如果不是bug,马上就有人指出的,不会浪费多少时间的

http://gcc.gnu.org/bugzilla/report.cgi

论坛徽章:
0
6 [报告]
发表于 2008-09-28 16:19 |只看该作者
为什么会这样不知道,不过,你链接之后应该只剩下一份了。

原帖由 dragchan 于 2008-9-28 12:01 发表
测试代码:
class A {
public:
    A();
    A(int _i);
    ~A();
    void hello();
   
pr ...

论坛徽章:
0
7 [报告]
发表于 2008-09-29 10:05 |只看该作者

回复 #6 freearth 的帖子

连接之后肯定是一份,这个我昨天就试过了,而且如果连接之后不是一份肯定早就发现了。

论坛徽章:
0
8 [报告]
发表于 2008-09-29 10:26 |只看该作者
我在maillist gcc提交了这个问题,以下是回复:

The ABI requires two separate versions of the ctor and dtor, one for
when the object being initialized is a base class and one where it's
not.  Because you used -C to demangle the names you can't see the
difference in the labels, but they really are different symbols.

It just happens that in most cases the two versions have identical
bodies, and they could theoretically be condensend into a single copy
with two labels or two entry points.  But doing this has ABI
compatibility implications.  It's a non-trivial problem to solve, and a
long-standing wart. See <http://gcc.gnu.org/PR3187>.

论坛徽章:
0
9 [报告]
发表于 2008-09-29 10:33 |只看该作者
我怎么感觉和demangle没关系?或者objdump的输出有问题?用objdump -t而不用--demangle符号名还是相同的,可能需要用UltraEdit之类的直接打开按ELF的格式去看了。

论坛徽章:
0
10 [报告]
发表于 2008-09-29 10:51 |只看该作者
很有钻研精神.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP