URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 34 » 绝对高手请进,如何控制c++编译器生成的代码
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
绝对高手请进,如何控制c++编译器生成的代码
 
 
 
 
 
 
 
 
 
Subject: 绝对高手请进,如何控制c++编译器生成的代码
Author: onlyflyer1    Posted: 2005-04-28 20:59    Length: 951 byte(s)
[Original] [Print] [Top]
例子代码如下:
//Test.cpp
class TEST
{
public:
void Function(){x=1;}
private:
int x;
};

TEST AAAA;

用g++编译:g++ -S Test.cpp //产生汇编语言文件
//Test.s
.file "Test.cpp"
.globl _AAAA
.bss
.align 4
_AAAA:
.space 4

由此可以看出,由于Function()这个方法没有被使用,所以C++编译器不生成他的代码.编译器这样作当然有它的好处,可以避免使用类库时可执行性文件包含一些不必要的代码.
但是,我现在不需要这个功能,请问如何能够让编译器生成Function这个函数的代码.
第二个问题,如何让g++先生成c代码,然后再生成可执行性文件.如果g++没有这个功能,那么其他的编译器有这个功能吗?如果有,有谁能告之?
第三个问题,如何控制类的成员函数生成的函数名,编译器往往会在成员函数上加上很多修饰,而不象是c语言那样简单的加上一个下划线.

谢谢呀!!!
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: onlyflyer1    Posted: 2005-04-29 01:14    Length: 262 byte(s)
[Original] [Print] [Top]
这里的反映不如csdn.我把这个帖子也在csdn贴了一下,很快就有8人回复,虽然回答的大都是废话.^_^

现在有一个问题已经搞清楚了,采用cc编译器可以产生中间的c代码.但是这个cc编译器是unix下的工具,不知道有没有windows和linux版本的.以及它的使用手册?高手继续指点呀
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: drangon_zhou    Posted: 2005-04-29 03:28    Length: 435 byte(s)
[Original] [Print] [Top]
你把funcion的实现也写到类定义中,一般编译器会把这个函数
默认成内联函数(就是说直接在调用的地方展开)。所以不会
产生函数的代码。

可以试试把这个函数移到外面:

//Test.cpp
class TEST
{
public:
void Function();
private:
int x;
};

void TEST::Function()
{
x=1;
}
----
岂有豪情似旧时,花开花落两由之。
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: onlyflyer1    Posted: 2005-04-29 09:22    Length: 580 byte(s)
[Original] [Print] [Top]
谢谢,实验成功!

还有一个问题,我记得读<<深度探索c++对象模型>>的时候,好像是记得编译器应该不会产生这个Funciton的代码,因为如果一个有时候使用某一个类的时候,往往只使用他的一个或几个成员函数,如果为他的每一个成员函数都生成代码,那么势必会使最终生成的可执行性文件的体积增大.

但是,实验的结果的确使产生了这个函数的代码?虽然我并没有调用这个函数.为什么?是不是上述编译优化选项在将c++翻译成汇编代码的过程中默认没有打开?还是c++编译器根本没有这个编译优化功能?

哈哈,有兴趣的进一步讨论呀.再次向drangon_zhou表示感谢!!
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: alula    Posted: 2005-04-29 10:50    Length: 43 byte(s)
[Original] [Print] [Top]
linker 在生成可执行文件才不会有Function函数
----
温故知新
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: alula    Posted: 2005-04-29 10:51    Length: 48 byte(s)
[Original] [Print] [Top]
可能是因为你牛气冲天的原因吧,路过的看到都回避了
----
温故知新
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: kangjie501    Posted: 2005-04-29 11:39    Length: 347 byte(s)
[Original] [Print] [Top]
>第三个问题,如何控制类的成员函数生成的函数名,编译器往往会在成员函数上加上很多修饰,而不象是c语言那样简单
>的加上一个下划线.

c++的编译器必须对函数名mangling,不然无法处理函数重载的情况。
如果程序中没有函数重载,可以把函数加上extern "C"的声明,让编译器不要对这个函数名mangling。
[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: onlyflyer1    Posted: 2005-05-02 23:31    Length: 397 byte(s)
[Original] [Print] [Top]
To kangjie501:
好像extren "c"只对非成员函数才起作用。
对成员函数不知道采用什么办法?

To alula:
你的意思是不是说只有Link的时候才会对可执行性文件进行处理,将不用的Function剔除掉?

还有谁能找到unix下的c++ 编译工具cc,这个东东据说可以产生产生中间的c代码。我找了好久都没有找到。有linux或者windows版本的都行。

[Original] [Print] [Top]
Subject: Re: 绝对高手请进,如何控制c++编译器生成的代码
Author: tigerwood    Posted: 2005-05-08 19:39    Length: 143 byte(s)
[Original] [Print] [Top]
不同的C++编译器在这些问题的处理上是不一样的
我只记得早期的C++编译器象CFRONT会把C++代码先转换成C代码,然后再调用C的编译器生成目标代码。
[Original] [Print] [Top]
« Previous thread
请教一个找好的方法!(linux 下 c语言编程的问题)
C/C++编程版
34
Next thread »
关于正则表达式的问题
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:59, cost 0.063424110412598 ms.