首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
C/C++
C++ 语言
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
有关inline函数
加为好友
发送私信
在线聊天
nextstar
等级:
发表于:
2008-06-26 13:57:53
楼主
在essential C++中提到,inline函数的定义最好放在头文件中,但是如果inline被优化了,那不是会出现函数被多次定义的问题吗?当inline被优化为普通函数的时候,在头文件中的一次定义,被多个文件inlcude了,这时候怎么处理的呢?
问题点数:
20
回复次数:
24
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
artman
The Final.
等级:
发表于:
2008-06-26 14:03:23
1
楼 得分:
0
头文件
使用编译伪指令避免重复定义
#ifndef _MY_HEADER_
#define _MY_HEADER_
//头文件内容
...
...
#endif
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
yyyapple
会用牙刷的鱼
等级:
发表于:
2008-06-26 14:06:13
2
楼 得分:
0
(一)inline函数(摘自C++ Primer的第三版)
在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。
inline int min(int first, int secend) {/****/};
inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline
函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。当然,对于同一程序
的不同文件,如果inline函数出现的话,其定义必须相同。对于由两个文件compute.C和draw.C构成的程序来说,程序员不能定义这样的min()函数,它在compute.C中指一件事情,
而在draw.C中指另外一件事情。如果两个定义不相同,程序将会有未定义的行为:
为保证不会发生这样的事情,建议把inline函数的定义放到头文件中。在每个调用该inline函数的
文件中包含该头文件。这种方法保证对每个inline函数只有一个定义,且程序员无需复制代码,并且
不可能在程序的生命期中引起无意的不匹配的事情。
(二)内联函数的编程风格(摘自高质量C++/C 编程指南)
关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。
如下风格的函数Foo 不能成为内联函数:
inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{
}
而如下风格的函数Foo 则成为内联函数:
void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{
}
所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。
一般地,用户可以阅读函数的声明,但是看不到函数的定义。尽管在大多数教科书中内
联函数的声明、定义体前面都加了inline 关键字,但我认为inline 不应该出现在函数
的声明中。这个细节虽然不会影响函数的功能,但是体现了高质量C++/C 程序设计风格
的一个基本原则:声明与定义不可混为一谈,用户没有必要、也不应该知道函数是否需
要内联。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
fuqd273
Joey
等级:
发表于:
2008-06-26 14:09:58
3
楼 得分:
0
学习
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Fioman
Think Hard
等级:
发表于:
2008-06-26 14:17:25
4
楼 得分:
0
inline函数和字符常量可以多次定义,只要这些定义都相同。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
taodm
taodm
等级:
发表于:
2008-06-26 14:25:30
5
楼 得分:
0
倒, “inline被优化为普通函数的时候”,这也能叫“优化”。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
richbirdandy
阿2
等级:
发表于:
2008-06-26 14:34:41
6
楼 得分:
0
引用 5 楼 taodm 的回复:
倒, “inline被优化为普通函数的时候”,这也能叫“优化”。
inline什么时候会这种“优化”??
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lionc650
coder
等级:
发表于:
2008-06-26 14:50:57
7
楼 得分:
0
学习~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Sevenlight_x
小七
等级:
发表于:
2008-06-26 15:08:19
8
楼 得分:
0
引用 7 楼 lionc650 的回复:
学习~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
k2eats
浩然正气 贵真求善
等级:
发表于:
2008-06-26 15:20:18
9
楼 得分:
0
引用 2 楼 yyyapple 的回复:
(一)inline函数(摘自C++ Primer的第三版)
在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联。
inline int min(int first, int secend) {/****/};
inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数。与非inline
函数不同的是,inline函数必须在调用该函数的每个文本文件中定义。当然,对于同一程序
的不同文件,如果inline函数出现的话,其定义必…
摘抄的很详细
我补充一下:
inline 建议显式写出来:static inline,使其只具有文件内部可见性
而GCC对这一点是默认的
GCC的inline更容易理解:可以认为它是一个普通全局函数加上了inline的属性。即在其定义所在文件内,它的表现和static inline一致
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
feitianmayi1986
飞天蚂蚁
等级:
发表于:
2008-06-26 22:31:07
10
楼 得分:
0
引用 4 楼 Fioman 的回复:
inline函数和字符常量可以多次定义,只要这些定义都相同。
字符常量可以多次定义可以理解,不过inline函数我在VS中测试了,不行。你能说的更清楚吗?
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
Gob00st
Gob00st
等级:
发表于:
2008-06-26 22:44:47
11
楼 得分:
0
引用 1 楼 artman 的回复:
头文件
使用编译伪指令避免重复定义
#ifndef _MY_HEADER_
#define _MY_HEADER_
//头文件内容
...
...
#endif
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
fish6344
顽童
等级:
发表于:
2008-06-26 23:01:11
12
楼 得分:
0
很愦憾的告诉大家,对于inline不必太关注,更不要对其优化程序的能力寄以厚望!
因为,就算你正确的使用inline,这只是对编译器提出的一个内联请求,但编译器并不一定会如你所愿而实施内联。
编译器自有一个复杂的算法,对你声明为inline以及并未声明为inline的函数决定其是否内联。换言之,如果你的函数代码并不满足编译器的内联标准,即使你声明为inline,编译器并不会为你的这个函数生成内联的码。如果你的函数代码简单到符合编译器的上述标准,现代编译器多半会自动使该函数的代码内联。且函数代码是否内联编译器并无提示。(请参考《More Exceptional C++中文版》page83)
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
ttzzgg_80713
身无立锥地,常有四海心---老子有条命
等级:
发表于:
2008-06-27 10:07:21
13
楼 得分:
0
汗
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
iwillalwaysloveyou
等级:
发表于:
2008-06-27 10:15:56
14
楼 得分:
0
谁能提供一个内联转宏程序?我用的编译器不支持内联
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xkyx_cn
飞翔的鱼
等级:
发表于:
2008-06-27 10:21:00
15
楼 得分:
0
要是inline对性能影响很大的话,早就“名扬天下”了
to lz:即使编译器没有理会inline申请,或者根据需要把声明inline转为普通函数调用,也不会让定义在头文件里的违反One definition rule的,即编译器能确保该函数在编译单元内只有一份定义
引用 12 楼 fish6344 的回复:
很愦憾的告诉大家,对于inline不必太关注,更不要对其优化程序的能力寄以厚望!
因为,就算你正确的使用inline,这只是对编译器提出的一个内联请求,但编译器并不一定会如你所愿而实施内联。
编译器自有一个复杂的算法,对你声明为inline以及并未声明为inline的函数决定其是否内联。换言之,如果你的函数代码并不满足编译器的内联标准,即使你声明为inline,编译器并不会为你的这个函数生成内联的码。如果你的函数代…
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
erac
tOmMy
等级:
发表于:
2008-06-27 11:03:35
16
楼 得分:
0
引用 14 楼 iwillalwaysloveyou 的回复:
谁能提供一个内联转宏程序?我用的编译器不支持内联
直接将你的代码COpy一份到Caller里面~~~
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
xzdwfwt111
xzdwfw111
等级:
发表于:
2008-06-27 11:07:20
17
楼 得分:
0
引用 1 楼 artman 的回复:
头文件
使用编译伪指令避免重复定义
#ifndef _MY_HEADER_
#define _MY_HEADER_
//头文件内容
...
...
#endif
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
iwillalwaysloveyou
等级:
发表于:
2008-06-27 11:08:14
18
楼 得分:
0
16楼的,我有大量内联函数
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
vlient
小游
等级:
发表于:
2008-06-29 22:07:00
19
楼 得分:
0
inline对程序的优化作用再某些情况下是极其明显的,(在我给项目做性能优化的时候,只是根据profile改写一个函数为内联,性能提升了300% 40s ->10s 大概700W次调用)而我做性能优化的一个很大利器,就是使用内联。
使用内联不一定能带来的性能的提示,但是在适当的情况下,他给你带来的惊讶是你之前所不能想象的。如果有些性能觉得重要的地方,可以使用aways inline强制编译器内联,只是你的承担内联带来的空间开销(同样会让你惊讶)。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lc19890326
Deep Blue
等级:
发表于:
2008-06-30 00:54:13
20
楼 得分:
0
#pragma once
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
grellen
STL
等级:
发表于:
2008-06-30 01:31:54
21
楼 得分:
0
学习
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lingol
等级:
发表于:
2008-07-02 12:45:07
22
楼 得分:
0
用VC的话,如果优化级别-O2或-O3,类的有些成员函数都会inline进去,即使你并没有这样声明/定义。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
EddyCoffee
双面人
等级:
发表于:
2008-07-02 22:29:12
23
楼 得分:
0
学习
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lijpbasin
lijpbasin
等级:
发表于:
2008-07-02 22:47:08
24
楼 得分:
0
赞19楼
窃以为实践得到的经验更宝贵些
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友