LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: graydream

说说C语言的现状把?

[复制链接]
发表于 2005-8-17 14:56:43 | 显示全部楼层
IMHO
C是更快的具有移植性的汇编语言的写法
想想C语言出现的历史背景
在追求软件运行速度,内存使用量和底层开发的时候
C几乎是唯一的选择
回复 支持 反对

使用道具 举报

发表于 2005-8-17 15:19:09 | 显示全部楼层
Post by dieken_qfz
对于C++和C来说, 效率取决于数据结构和算法以及编译器的实现, 往往C的初手写的代码效率不怎样.
除非是拿C++当C用,或者是巨简单的程序,否则C++的初手写出来的东西效率更差。数据结构和算法可以使效率成指数倍提高,但是因为C++的封装浪费的时间,用C来避免这些可以提速20%以上,甚至可以到50%。
Post by dieken_qfz
UNIX一系列一直都是C一统天下, 而且C++的标准出来比较晚, 而且语法比C复杂了不止一倍两倍, 高手用C++能写出简洁高效漂亮的代码, 可惜绝大部分人都不是C++高手。
C确实比C++早出来几年,但是C++肯定比Linus开始写Linux早,也比Windows出来的早。这些写操作系统的不用C++肯定还是钟情于C的效率。就像那个变态John Carmack,就是不用C++。
Post by dieken_qfz
其实觉得大部分人也不是C高手。
完全同意。
Post by dieken_qfz
这几天看到一段宏,挺好玩的:
extern int add(int x, int y);

#define add(...) (trace("add(%d, %d)\n", __VA_ARGS__), add(__VA_ARGS__))

#define trace(...) (fprintf(stderr, "[%s:%d:%s]", __FILE__, __LINE__, __func__), \
                fprintf(stderr, __VA_ARGS__), fflush(stderr))

这样在调用add(1, 2)时会打印出跟踪信息:
[hello.c:24:main]add(1, 2)

好处是不用修改.c文件就可以知道在什么地方调用了add,参数是什么。
这样的宏在Linux内核代码里比比皆是,就是利用了编译器定义的一些宏而已。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 15:20:20 | 显示全部楼层
Post by gradetwo
内核没有采用c++也不能说明什么,顶多只是linus不喜欢c++而已。
操作系统可不是只有一个Linux啊。
回复 支持 反对

使用道具 举报

发表于 2005-8-17 18:27:16 | 显示全部楼层
C和C++都很高效,主要还是可移槙性吧!
C++缺少各个平台都支持的标准库
回复 支持 反对

使用道具 举报

发表于 2005-8-18 04:28:01 | 显示全部楼层
原因太多了。
1. C compiler 的效率比C++高太多了,在需要high performace 的场合,肯定是 c.
2. 个人一直不喜欢macro, 调试的时候看到的和源代码不同,完全可以用inline代替。
3. kde是用c++开发的,一样有很多的binding: python, ruby, javascript, perl, java, c# ...
回复 支持 反对

使用道具 举报

发表于 2005-8-18 10:24:47 | 显示全部楼层
Post by bookstack
2. 个人一直不喜欢macro, 调试的时候看到的和源代码不同,完全可以用inline代替。
不是所有的macro都可以被inline取代的,比如宏定义里的##
  1. #define A(x,y)   (##x##y)
复制代码
就没法用inline取代。看反汇编出来的代码(记不清加没加-g了),好像inline仍然有出入栈的操作,相比较macro还是多了不少操作的。
回复 支持 反对

使用道具 举报

发表于 2005-8-18 18:22:59 | 显示全部楼层
c有简单的语法和关键词,C++语言上很复杂。在应用程序的编写上还有java可选,虽然java比c++慢很多但是java更容易移植。
c应该在最近十年内不会淘汰的。
回复 支持 反对

使用道具 举报

发表于 2005-8-18 18:34:21 | 显示全部楼层
Post by gamedragon
不是所有的macro都可以被inline取代的,比如宏定义里的##
  1. #define A(x,y)   (##x##y)
复制代码
就没法用inline取代。看反汇编出来的代码(记不清加没加-g了),好像inline仍然有出入栈的操作,相比较macro还是多了不少操作的。

如果编译时加了-O,inline才会被编译成汇编代码直接嵌在被调用的地方
回复 支持 反对

使用道具 举报

发表于 2005-8-18 20:41:17 | 显示全部楼层
真正成品的时候至少是个O2吧
Post by zhllg
如果编译时加了-O,inline才会被编译成汇编代码直接嵌在被调用的函数里
回复 支持 反对

使用道具 举报

发表于 2005-8-18 23:56:25 | 显示全部楼层
恩,-O是最低要求,不加的话就和没用inline一样
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表