免费注册 查看新帖 |

Chinaunix

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

[C++] 确认一下c++中不能使用interface(如java)那样的功能把 [复制链接]

论坛徽章:
0
321 [报告]
发表于 2009-03-27 19:28 |只看该作者

回复 #278 liuty2006 的帖子

你确信“微软的OS大部分代码都是c++写的,除了kernel部分”?
你确信 advapi msgina cryptapi 那些也都是用 C++ 写的?
刚拿记事本看了一下那几个 DLL,没发现 C++ 运行库的影子。莫非 MS 用了别人的 STD C++ library?
要不……咱们在“内核”和“用户”这两个概念的区分上有分歧,也就是说,advapi msgina cryptapi 都算在内核里的?
又或者……微软很牛掰,他一点也不依赖 STL,只用了类和模板?好像还是没找到一点影子嘛。哇噻,微软太牛,把所有的痕迹都抹除了?
我无能为力,你支个招儿吧。



[ 本帖最后由 langue 于 2009-3-27 19:37 编辑 ]

论坛徽章:
0
322 [报告]
发表于 2009-03-27 19:30 |只看该作者
哈哈哈哈,精彩,大笑两声,闪开~

论坛徽章:
0
323 [报告]
发表于 2009-03-27 19:37 |只看该作者
原帖由 yhb04 于 2009-3-27 19:05 发表
CU就语言之争这种年经贴最火了。
上面谁说C无法实现OO多态的?用C可以很容易实现多态,具体例子??自己去看看Linux内核代码中VFS具体实现吧。
呵呵,我倒是见过有个微内核L4宣称自己是用C++加ASM写的,不过拿到代码一看,我操,人家是在用C++写C风格的代码。
PS:是个语言就能自举


我还真想看看JAVA怎么把自己给举起来,PYTHON呢?

论坛徽章:
0
324 [报告]
发表于 2009-03-27 19:40 |只看该作者
原帖由 sorrento 于 2009-3-27 19:37 发表


我还真想看看JAVA怎么把自己给举起来,PYTHON呢?

不要怎么认真吗。我只是说说而已。
JAVA实现一个JAVA编译器没有任何问题,不过实现JVM就够呛。
好,我收回这句话。。。

论坛徽章:
0
325 [报告]
发表于 2009-03-27 20:20 |只看该作者
原帖由 langue 于 2009-3-27 19:28 发表
你确信“微软的OS大部分代码都是c++写的,除了kernel部分”?
你确信 advapi msgina cryptapi 那些也都是用 C++ 写的?
刚拿记事本看了一下那几个 DLL,没发现 C++ 运行库的影子。莫非 MS 用了别人 ...

那的看你怎么定义出c++了。
STL只是c++支持泛型变成的一个库。没听说用c++就一定要用STL。
c++是更好的c。其精髓是---接口编程。
认识这个后,再看MS的那些COM组件,难道不属于c++范畴。
COM组件将c++接口编程发挥到了极致。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
326 [报告]
发表于 2009-03-27 20:23 |只看该作者
原帖由 yhb04 于 2009-3-27 19:05 发表
CU就语言之争这种年经贴最火了。
上面谁说C无法实现OO多态的?用C可以很容易实现多态,具体例子??自己去看看Linux内核代码中VFS具体实现吧。



没人说C无法实现多态或者oo。 牛逼的人用asm都能实现oo, 不是么?


稍看了一下传说中的《OOC》。

1. 用人力, 或者说蛮力, 去实现c++编译器已经实现的东西。

我们为什么需要计算机?  为了使自己从繁重的重复的劳动中解脱出来。
别的我也不说了。

2. 时空效率不如当前c++编译器采用的,流行的实现方式。

对member function, 采用的是one function one slot的方式。

struct Class {
size_t size;
void * (* ctor) (void * self, va_list * app);
void * (* dtor) (void * self);
void * (* clone) (const void * self);
int (* differ) (const void * self, const void * b);
};

一个对象有多少成员函数, 就有至少有多少个函数指针。


3. 错误检查。

如果你真的足够牛, 可以记住所有的, void*实际指向的是什么东西, 记得每一个new对应的delete, 记得 ……
总之, 不犯任何错误。  那么你这样写吧。

对于不如你牛的人, 用c实现oo, 是否如同提倡在大量使用c++高级特性一样, 不合理, 有心智包袱

对于oo, c++只需要很少的学习成本(比用c实现oo少太多)。  关键是自己能否克制住不去胡乱的学习。


4. c实现oo的优势。

我目前唯一能想到的优势就是移植性 ……  c确实比c++要好很多很多……


重要补充 ! 上面的2有问题, 具体请看 —— 335楼 , yhb04的帖子。

[ 本帖最后由 OwnWaterloo 于 2009-3-27 22:14 编辑 ]

论坛徽章:
0
327 [报告]
发表于 2009-03-27 20:29 |只看该作者

回复 #328 liuty2006 的帖子

好吧,你说得挺有道理,可惜你还是没有拿出具有足够说服力的证据来表明“微软的OS大部分代码都是c++写的,除了kernel部分”。

论坛徽章:
0
328 [报告]
发表于 2009-03-27 20:40 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 20:23 发表



没人说C无法实现多态或者oo。 牛逼的人用asm都能实现oo, 不是么?


稍看了一下传说中的《OOC》。

1. 用人力, 或者说蛮力, 去实现c++编译器已经实现的东西。

我们为什么需要计算机?  为了使 ...

1. 用人力, 或者说蛮力, 去实现c++编译器已经实现的东西。

我们为什么需要计算机?  为了使自己从繁重的, 重复的劳动中解脱出来。
别的我也不说了。

>>木有错,这是C++的主要优点。

2. 时空效率不如当前c++编译器采用的,流行的实现方式。

对member function, 采用的是one function one slot的方式。

struct Class {
size_t size;
void * (* ctor) (void * self, va_list * app);
void * (* dtor) (void * self);
void * (* clone) (const void * self);
int (* differ) (const void * self, const void * b);
};

一个对象有多少成员函数, 就有至少有多少个函数指针。

>>这个说法是有问题的。C实现多态也是使用类似这种方式。或者说C++编译器在实现多态时采用的就是C实现多态的方式。所以两者的时空性能其实是一样的。


3. 错误检查。
如果你真的足够牛, 可以记住所有的, void*实际指向的是什么东西, 记得每一个new对应的delete, 记得 ……
总之, 不犯任何错误。  那么你这样写吧。

对于不如你牛的人, 用c实现oo, 是否如同提倡在大量使用c++高级特性一样, 不合理, 有心智包袱?

对于oo, c++只需要很少的学习成本(比用c实现oo少太多)。  关键是自己能否克制住不去胡乱的学习。

>>用C实现OO的多态还是非常简单的,你可以把它理解为一种“设计模式”。
函数指针也是编译时检查的,所以并不存在大量void*指针。
或者这么说吧,用C可以很自然实现方法的多态,但是类的继承就够呛。

[ 本帖最后由 yhb04 于 2009-3-27 20:44 编辑 ]

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
329 [报告]
发表于 2009-03-27 21:13 |只看该作者
原帖由 yhb04 于 2009-3-27 20:40 发表
这个说法是有问题的。C实现多态也是使用类似这种方式。或者说C++编译器在实现多态时采用的就是C实现多态的方式。所以两者的时空性能其实是一样的。


不, 目前c++编译对non-virtual member function的流行的实现方式中,对象是不带函数指针的
也就是说, non-virtual member function没有任何额外开销
这点上, c++编译器是占优势的。


目前c++编译器对virtual function的流行的实现方式是:
one object one vptr (pointer to virtual function table), one class one vtbl (virtual function table)。
这样会多一次间接, 但是每个object需要的内存是常数

btw : 如果要用c模拟这种实现方式, 将要进行大量的函数指针转型工作, 而且是在每一个虚函数调用处
我说清楚一点 :
为了得到常数时间索引, 要采用数组做虚函数表。
但是, 数组是同构的, 无法塞下签名不同的函数指针。
所以, 只能使用 const uintptr_t vtbl []  = {  &vf1, &vf2 , ... },或者类似的东西, 来塞入虚函数指针。
然后, 在每一个虚函数的调用处,使用 vptr 寻址到 vtbl, 由人脑记住, 某个虚函数应该是在虚函数表中的第几项, 它的签名是什么。
记错一个, game over。



而one member (virtual or non-virtual) function , one slot
少一次间接, 但是每个object需要的内存和成员函数数量成线性关系
编程也不那么复杂。



原帖由 yhb04 于 2009-3-27 20:40 发表
函数指针也是编译时检查的,所以并不存在大量void*指针。


对, 函数指针类型是很“强” 的。

但是, “所以并不存在大量void*指针”, 并不正确。

我随便摘《OOC》中的一段代码 :

int main()
{
    void* s = new(Set);   // 一旦使用void* ,类型信息就丢失了
    void* a = add(s , new(Object) ); // 这个s是否是Set, 由编程人员靠人力记忆
    void* b = add(s , new(Object) );
    void* c = add(s, new(Object) );
   
    // ...


这段简单的代码,  只要不是《我脑中的橡皮擦》的女主角 ……  当然很容易记住 s是一个Set。
但是代码多了之后呢?

这是弃C语言静态类型优势,  向动态类型语言靠拢



原帖由 yhb04 于 2009-3-27 20:40 发表
或者这么说吧,用C可以很自然实现方法的多态,但是类的继承就够呛。


类的实现继承, 通常是一种不好的设计, 所以我就没举这个例子。
但是,  上面用C实现多态,  真的算自然么?

[ 本帖最后由 OwnWaterloo 于 2009-3-27 21:18 编辑 ]

论坛徽章:
0
330 [报告]
发表于 2009-03-27 21:18 |只看该作者
原帖由 OwnWaterloo 于 2009-3-27 16:03 发表

c++特性是很多,  很难操控得好。  但是团队可以根据自己开发人员的水平,人为规定应该采用c++的那些特性。
google的c++ code guide就是一个很好的例子。


Good,没事去look下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP