| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1213 人关注过本帖, 1 人收藏
标题:gcc关于内联函数的问题
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:15 
inline,只是一个建议,其实(可以说得上是好的)编译器在编译时,它会分析哪些函数可以inline、哪些不应该,对于可以inline的,即使不写inline声明,它也会以inline方式编译,对于不应该的,哪怕你写了inline,也是没有inline的,这就是我摘引《C++ Primer》书中【注意】第一点所说的意思,因为你根本不可能用inline左右编译器的真实行为。所以,在我的实践中,基本上不会写inline字眼。

不要把精力放在这种微观优化上,这是我和《编程规范》共同给你的忠告。“太多的程序员习惯……”

[ 本帖最后由 TonyDeng 于 2015-1-11 19:55 编辑 ]

授人以渔,不授人以鱼。
2015-01-11 18:31
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
回复 11楼 TonyDeng
内联这种东东一般很少会涉及到,只是最近在看一些源代码就想弄清楚内联之后的指令到底是怎样的。没想到各位还挺热心的。
看TonyDeng连发好几段话是有关C++的,就是想问问这位大神一个问题:
你觉得C语言和C++语言的区别是什么?类和多态什么的就算了,只说说共有的一些东西。
2015-01-12 02:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
内联是C++设计时用于取代宏的机制,后来被C采纳,也可以用内联了,也就是说,传统的C多用宏,新式的C应转用内联。这与C原本要求变量声明在函数的开始处,后来标准引入C++的做法,允许变量就近声明,以增强可读性。C的新标准,很多是从C++来的。

C++和C的关系。最早,C++是作为C的扩展而出现,++是Plus,加法的意思,++在C的后面,表示C之后的扩展。C++很多语法是为了加强C的性能和弥补缺陷而来的,当我们不使用C++的面向对象思想进行编程的时候,完全可以把C++作为加强版的C使用,写出面向过程的代码,只不过那必须用C++编译器罢了(C99的不少新规定已经向此靠拢)。C++对C的加强(即排除面向对象的部分),基本上是依据编程实践而来的,比如变量就近声明,是因为人脑阅读代码,当到达变量使用的区域,最好就在使用之前瞬间看到变量是如何声明和定义的,而不是让人往前翻页去查看集中在开头处的声明,这样来回翻页的动作可能会干扰人的思维(其实跟人阅读书面文章一样),诸如此类的东西,都是为了更人性化的界面(代码的书写的布局就是呈现给程序员看的界面,必须友好和符合人的思维习惯)。这是C++的设计原则,相反,C最早是设计用于与机器打交道的,不会照顾人,但C++的原则是在保留C的高效性的同时改善与人的关系。

这些就是C++与C共有的东西。比如内联,用宏固然能实现,但编译器是不检查宏的参数类型的,如果程序员在后面使用宏的时候,输入了与意图不符的参数,编译器根本检查不出来(因为宏的处理在编译之前,在语言语法起作用之前就把代码展开了,它只检查展开之后的代码的合法性,而那样是没有参数类型声明的),这一点,与C语言的强类型语言的本质不符,等于取消类强类型语言的优势,还不如直接用解释语言写程序。C++为了弥补这个缺陷,就推出了内联机制,它在代码的嵌入方面与宏是一样的,但却保留了参数类型检查这一关键环节。这个例子,也等于向你解释了C++是如何针对C的缺陷而扩展语言的,它针对什么,为什么要这样,理解C++,实际上也等于理解C,如果你不知道内联的这种机制解释,就不大理解人家为什么不推荐用宏,也知道很多保守的C程序员看古老代码学来大量的宏语法其实是不可取的,自己写程序也知道怎么回事,即使是用宏,也有相关的风险意识,懂得回避,也知道查错从哪入手。其实,我一向不鼓励人保守,推荐多学几门语言,互相比较,才能对主要语言有深刻的理解,不至于人云亦云,什么大师、大神说如何如何,不至于轻信。坛上也见过不少宏的迷信者,觉得写出如此这般神奇的宏代码是多么牛逼,但实际上别人可能不以为然,不过,这属意识形态问题了,各人取向,不能强求——但明白是怎么回事总不坏。

授人以渔,不授人以鱼。
2015-01-12 18:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
我一直都有说,有C++这种功能更强、更友好的编译器,不必死守C编译器,只要我们写出来的代码仍然是面向过程的,本质上那就是C代码,不是什么C++代码,哪怕你使用了C++的类库函数,也不过等于使用了更庞大的函数库而已,C++与C的本质区别在思想上,不是在语法上。因此,我不鼓励人非要用.c作源代码文件的扩展名不可,常说那样做和那样要求的人,是读死书、不知变通,原因就在这里。

像微软的VC++,本来是C++,但C++作为设计初衷,就是以兼容C为根基的,当你强制VC++回归为C编译器的时候,微软不遵守若干C标准的规定并不奇怪,因为那些新标准的特性本来就是从C++语法而来,VC++编译器作为C++编译器使用的时候,它完全可以通过那些C编译器不通过的代码,这个时候,作为学生的你,傻傻地听人说一定要用C编译器不可,就等于僵化了你的思维,把你培养为不知变通的书呆子,但程序员其实是最忌讳这样不灵活的,品格一旦形成,你终身就毁了。

“博采众家,为我所用”,这是我推荐的八字真言,信不信由人了,赫赫~

授人以渔,不授人以鱼。
2015-01-12 18:43
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
很多语言都基于C而发展起来,像C++、Java、C#等,都使用类似C的语法,但人家既然是后来者,一定是根据实践经验作出改善的,不是因为你的C够古老有多牛逼。人家为什么取消某些特性、扩展了什么特性,必定有其解释,我们需要知道那些解释是什么,自己去决定取舍,即使你不采纳,也可以知道陷阱在哪里,知道规避。不是一句人家新的东西多么烂那样说话的,说那种话的,要么是迷信的教徒,要么是脑子有毛病。

在教育体系上,以C作为入门语言,不过是要学生熟悉一些常见的C语法,那些后来语言都采用的语法形式,不是叫你把C钻研的多精深,我看见很多人把精力花在那些地方,甚至对C的陋习津津乐道以为秘笈屠龙术的,说那是入了魔道,也是这个缘故。哪些是C的通用知识呢?比如花括号风格,比如独特的for()循环,这些就是了。人家Java和C#为什么取消了头文件(.h)?你学C却天天问什么什么头文件到哪找?知道C++语言之父说过无法取消头文件是C++语言无法消除之痛、以及对宏有多么深恶痛绝吗?不过,还是那句话,这些纯属意识形态,不接受也是可以的,但是不等于人家说的完全没有道理,关键是你自己知道问题何在,并懂得正确处理。

授人以渔,不授人以鱼。
2015-01-12 19:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
弱化或者取消数据类型检查,会出现什么问题?看看新手们有八成以上栽在scanf()/printf()的问题就知道了!诸如为什么“我float x; scanf("%d", &x);编译没问题运行出错”之类,就是这个原因造成的。C语言的本质是什么呢?它是“静态强类型检查语言”。所谓“静态”,是指编译阶段就进行的,在程序实际运行之前就做足一切检查错误可能的功夫,这样才能在运行时速度更快,对比解释型语言和弱类型检查语言,要在运行时嵌入类型检查的代码耗费时间相比,有极大的优势。所谓“强类型”,是指类型需要严格匹配。像scanf()/printf()那样的函数,就是取消了编译时的类型检查,所以哪怕x是浮点类型与期望的"%d"整数指示类型不符,也检查不出来,这系列函数实际上就是一个小型的语言解释器,什么%d、%[^/]之类规则,都是这些函数编写者自己创造的与C不同的解释语言,你花大量的力气在这些地方,实际上就不是学C,学scanf()/printf()语言罢了。C程序员的另一习惯,就是爱用类型转换,随意把float当int解释,好像自己对机器的细节非常了解似的(当然,这也是C作为系统语言的原因,但前提是你真的对机器细节有把握,所以它往往是针对具体机器环境的嵌入式,如果试图写跨平台的程序,这种习惯必定害死你),那种用void指针随意变换数据解释的神技,也是在实际上颠覆C的强类型语言本质。总之,很多C的“屠龙术”,其实都是在C的反面上使用的,尤其是那些爱使用副作用的程序员,非常偏好此道。

授人以渔,不授人以鱼。
2015-01-12 19:28
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
新手,学结构化编程是最重要的。不管是C还是C++,还是任何别的编程语言,都应按照结构化的要求编写和组织代码,这就共同点。

授人以渔,不授人以鱼。
2015-01-12 20:27
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:0 
回复 17楼 TonyDeng
非常感谢能够说这么多。
其实自己对语言也没有多少偏好。
我一直把C++、C#、JAVA,还有别的一些面向对象的语言归类为商业软件语言,把C和汇编语言归类为理论语言。
商业软件语言主要用来应付短期内必须交接的开发大型项目。
理论语言主要用来研究计算机科学方面的一些理论只是。
恩,就是按用途分类的。呵呵。
2015-01-13 14:07
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
C++是系统语言。我看把C++当成GUI、MFC之类的同义词了。C++最早是在DOS/*nix之类的文本界面上实现的。C也可以做商业软件,我就用它做过卡拉OK的点歌系统,图形带汉字的,有歌星照片选歌的,用C做是只因为那个时候的PC只有640K内存可用,写的程序,自身读字库处理,为的是不要CCDOS占用内存。

授人以渔,不授人以鱼。
2015-01-16 13:25
快速回复:gcc关于内联函数的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032663 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved