免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: xyfree
打印 上一主题 下一主题

删帖吧 [复制链接]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
11 [报告]
发表于 2011-07-20 12:18 |只看该作者
回复 8# xyfree

他有说:
1. cache有多大吗?
2. cache失效率吗?
3. cache是 per object的? 还是 per class的?
4. 内存占用多也会导致置换机会增加

至于如何实现的我也不清楚, oc开源么?

另:
>> 附注:这人很明显不是SB,资深Obj C 程序员。
资深 Obj C 有屁用。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
12 [报告]
发表于 2011-07-20 12:31 |只看该作者
回复 9# wwwsq

果然是个只顾陈述自己观点丝毫看不进(看不懂?)他人观点的……

1. 关于 tab
如果你真的会用你说到的那几种编辑器 —— 其他我不敢保证, 至少vim —— 根本不存在 2-5 的问题

2. 关于函数指针

2.1 从你5楼的言论推测, 应该说的是 pointer to (plain C)function , 而非 pointer to member function 或者其他事物。
自己好好想想什么叫 "完成与虚函数相同功能的情况", 再想想函数指针与虚函数是不是一回事。

2.2 如果函数指针是指 pointer to (plain C)function
研究C++这么多年了, 我只听说过:
i) 静态变量(变量可能函数指针类型)
ii) 静态成员函数
那还真得请你科普一下什么叫 静态函数指针

论坛徽章:
0
13 [报告]
发表于 2011-07-20 12:51 |只看该作者
C++可以用模板或者自带的库去避开虚函数,如Lambda、Function、Bind等,
使用C风格的函数指针不是一个好习惯

论坛徽章:
0
14 [报告]
发表于 2011-07-20 13:15 |只看该作者
虚函数调用可能会被编译成
(*_vptr)[1](x,y)这样的形式。哪里来的效率更差?

论坛徽章:
0
15 [报告]
发表于 2011-07-20 13:51 |只看该作者
虚函数调用可能会被编译成
(*_vptr)[1](x,y)这样的形式。哪里来的效率更差?

这样的话 多肽就没有意义了  要有普遍性。



你们的项目已经到了 虚函数成为性能瓶颈了吗?

论坛徽章:
0
16 [报告]
发表于 2011-07-21 11:00 |只看该作者
虚函数调用可能会被编译成
(*_vptr)[1](x,y)这样的形式。哪里来的效率更差?

这样的话 多肽就没有意义了 ...
newmax123 发表于 2011-07-20 13:51



    _vptr是运行时决定的,调用哪个函数最终是根据特定的类来决定的
   为什么会导致多态没有意义?
虚函数 的开销是  需要动态决定vptr这样需要编译器添加一些其他代码, 同时最主要的开销就是找到函数需要2次地址解析。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
17 [报告]
发表于 2011-07-21 12:38 |只看该作者
本帖最后由 koolcoy 于 2011-07-21 12:41 编辑

哭啊,这么热闹的帖子竟然来晚了{:3_184:}

C++的虚函数没多大的性能开销,理由如下:
1. 普通函数调用就是两步:取函数地址,跳转。虚函数分三步,取vtable地址,取函数地址,然后跳转。
2. 大部分的虚函数调用(如果没记错的话BS好像给出过数据的,是80%)都会被编译器优化成普通函数调用,只有少部分会通过vtable去调用函数。
3. 缓存的命中与否对虚函数的调用影响并不大,因为vtable不大,如果缓存能命中加个vtable也能命中,如果不能命中,没vtable还是不能命中。

最后,如果你的的确确需要虚函数提供的功能,那么虚函数是性能最好的选择,函数指针的性能开销只会比虚函数大,不会比虚函数小,因为用函数指针你需要做虚函数所做的所有事情,但是用函数指针的话编译器就没法帮你优化。说obj c的message比虚函数快,那是胡说八道,obj c能缓存函数调用,C++编译器就不会缓存vtable中的值啊

其实绝大部分程序都不必考虑虚函数调用产生的那么一丁点性能开销。你一不留神,算法没实现好,一个O(n)的算法被写成O(n^2) ... 不要捡了芝麻丢了西瓜

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
18 [报告]
发表于 2011-07-21 12:56 |只看该作者
回复 5# wwwsq

>>告诉你们一个秘密,函数指针是可以指向class member function的
这是标准的不懂装懂,pointer to function跟pointer to member function的大小都不一样{:3_183:}

  1. #include <stdio.h>

  2. class foo {
  3. };

  4. int main() {
  5.         printf("%d, %d\n", sizeof(void (*)(void)), sizeof(void (foo::*)(void)));
  6.         return 0;
  7. }

复制代码

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
19 [报告]
发表于 2011-07-21 14:25 |只看该作者
_vptr是运行时决定的,调用哪个函数最终是根据特定的类来决定的

是这样吗?我怎么觉得虚表本身是编译时期决定的,只是_vptr指针在构造里面赋一下4个字节的指针值就OVER了。

pointer to function跟pointer to member function的大小都不一样

这个原先还真不知道,GCC试了下,pointer to member function居然是8个字节!?VC测试了是4个字节。
不过用8个字节不浪费么?4个字节应该足够了啊{:3_198:}

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
20 [报告]
发表于 2011-07-21 14:57 |只看该作者
回复 19# w_anthony

情况复杂些,当使用了多继承和虚继承的时候一个简单的指针是没法搞定的。 http://www.codeproject.com/KB/cpp/FastDelegate.aspx

  1. #include <stdio.h>

  2. class a {};
  3. class b {};
  4. class c : virtual public a, public b {};

  5. int main() {
  6.         printf("%d\n", sizeof(void (c::*)(void)));
  7. }

复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP