为什么要转为一个static函数(static函数是不是指static member function)?

niuniu612 2005-05-10 12:43:00
inside c++ model (中文)184页

“如果函数因其复杂度,或因其建构问题,被判为不可成为inline ,它会被转为一个static函数”
为什么要转为一个static函数(static函数是不是指static member function)?
...全文
270 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
niuniu612 2005-05-11
  • 打赏
  • 举报
回复
up
Dream_soft 2005-05-11
  • 打赏
  • 举报
回复
这时指得是在类外定义Inline函数的情况吧?这种情况下Inline失败就被标记为static。这里的static指的是文件作用域。
任何函数都只有一份拷贝,类的static和成员函数的区别在于没有隐含传递的this指针。与一般的非成员函数相比,主要在类数据访问权限上有区别。
不过,这种对outlined inline的处理现在已经过时了。具体的情况你可以参考Effective C++ 条款33: 明智地使用内联,我就不多说了。
xuanwenchao 2005-05-11
  • 打赏
  • 举报
回复
inline 指定为编后相当于将函数拷贝一份到调用的位置. 而它还是属于对象级的.

而static不管实例的几个对象它只会有一个,是属于类级别的.
zeeeitch 2005-05-11
  • 打赏
  • 举报
回复
和Dream_soft一个看法:这里的inline是全局(非类成员)函数。失败后标记为static,此static是指“可见性”——“static关键字很容易使人糊涂,因为它有时控制存储分配,而有时控制一个名字的可见性和连接”
dzw2004 2005-05-11
  • 打赏
  • 举报
回复
up~
zhaokugua 2005-05-11
  • 打赏
  • 举报
回复
static属于类而不属于对象
whyglinux 2005-05-11
  • 打赏
  • 举报
回复
>> 如果象你那么说那都具有外部连接就意味着编译器要处理,只把一个弄成可见的,对吗?要不然就连接错误了,这样不合理

是的。如果具有外部连接的inline函数不能进行内联时,编译器要把它作为普通函数对待,同时
1、编译器要进行内部处理,不能因为inline函数具有的多个定义而出现重复定义的错误。
2、编译器要从多个定义中选择一个生成函数的执行代码。至于选择哪一个,应该是实现相关的问题。
cppprogramlover 2005-05-11
  • 打赏
  • 举报
回复
呵呵,多谢指点,也是,不是很好的方法,代码增多了,数据也多了,如果象你那么说那都具有外部连接就意味着编译器要处理,只把一个弄成可见的,对吗?要不然就连接错误了,这样不合理
cppprogramlover 2005-05-11
  • 打赏
  • 举报
回复
而且根本没有提到是成员函数,怎么都猜那个呢,吓猜?
cppprogramlover 2005-05-11
  • 打赏
  • 举报
回复
大家猜得应该都不对,不能是成员函数,为什么这么肯定说呢,因为成员函数(哪怕是类里面定义的)都很有可能inline不了,而一旦这样就改为static函数,显然不能接受(比如一个正方形带内接圆的类,画圆函数如果不能inline那成什么样子了,那就成了正方形了)。
而一般的函数只要是inline 如果你要在别的文件引用 就必须包括其定义以便inline展开,而如果不能inline,那么对这个函数就不能使用inline函数的单一定义规则(可以多个文件出现定义),必然出现链接错误(重复定义函数);而此时解决办法就是使其static化!我觉得设计这个方案很好!
没有看过书,猜得,但是觉得应该是这样,如果我错了,请指教
whyglinux 2005-05-11
  • 打赏
  • 举报
回复
To cppprogramlover(爱相随—)

而一般的函数只要是inline 如果你要在别的文件引用就必须包括其定义以便inline展开,而如果不能inline,那么对这个函数就不能使用inline函数的单一定义规则(可以多个文件出现定义),必然出现链接错误(重复定义函数);而此时解决办法就是使其static化!我觉得设计这个方案很好!

================================

只能说这个static化的设计方案简单解决了inline函数不能内联时出现的重复定义的错误,但是却不能称之为一个好的设计方案。因为函数加上static关键字之后它的连接属性就变为内部连接,这样的话在每一个使用这个函数的编译单位中都会生成一份函数代码,尽管实际上是同一个函数。就如Dream_soft(Dream_soft) 在上面说的,这是一种“过时”的做法。

现在,C++标准规定不加static修饰的inline全局函数(区别于类的成员函数)和非inline全局函数一样具有外部连接属性,这样就保证了inline全局函数在内联不成功时将只有一份函数代码生成。为此目的,上面将函数改为static的简单做法显然就不能胜任了,因此编译器需要做更多的工作以完成这一任务。
healer_kx 2005-05-10
  • 打赏
  • 举报
回复
这书没有看过。。。
niuniu612 2005-05-10
  • 打赏
  • 举报
回复
"static函数只有一份拷贝!不属于一个对象,应该不是成员函数" ----引用 Seu_why
那么这个static函数在调用的与一般的非成员函数有什么区别?
oyljerry 2005-05-10
  • 打赏
  • 举报
回复
静态成员函数属于这个类
Seu_why 2005-05-10
  • 打赏
  • 举报
回复
static函数只有一份拷贝!不属于一个对象,应该不是成员函数.
niuniu612 2005-05-10
  • 打赏
  • 举报
回复
不明白

可能我表达的不清楚,我是想问,inline转为一个static函数,那为什么不转为一个成员函数

还有static函数是指非成员函数吗?非成员函数又是static的先,意味着什么,难理解?
zeeeitch 2005-05-10
  • 打赏
  • 举报
回复
这里所说的函数是否指非成员函数?
the_mask_of_zorro 2005-05-10
  • 打赏
  • 举报
回复
对你的这个问题
可以这样理解
在class内部
不可成为inline ,它会被转为一个static函数

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧