西西河

主题:【文摘】C/C++圣战! -- aircobra

共:💬26 🌺3 新:
全看树展主题 · 分页首页 上页
/ 2
下页 末页
家园 行家伸伸手,便知有没有!

老兄一看就是行家里手,佩服,佩服!

家园 您过奖了,都是在国内干私活的时侯得出的经验

给公家干活,可以偷懒、耍赖,当当国家的主人;干私活就不行了,钱和江湖名声在那里逼着,干到天亮是经常的;否则就国营单位那三瓜俩枣,拿什么养老婆?

干私活最不幸的就是来什么就得干什么,这回是foxbase,下回就是C,刚刚还是DOS,转脸又回到Unix上去了,顺手再干干OS/2下面的活。

最惨的一次是给日本富士通改程序。那个程序是用High C写的,使用了DOS扩展,经过了N道手,没有文档、注释不多,全靠硬看源程序。我们接手的时候,High C已经到了3.x版,有了调试工具,但是小日本的源程序是用High C的1.7版写的,没有调试工具,要求我们也还用这个版本来做,我们就苦喽。怎么调试呢?就一招,printf。

最有趣的是给OS/2做程序。OS/2其实是对开发人员最好的操作系统,为什么这样说呢?因为它的各个版本之间经常是互不兼容的,没错,双向不兼容!这样只要系统一升级,应用程序也必须跟着升级,否则就没法运行了,这样开发人员就永远有活干了。我在OS/2 1.1下面用的是C/2,1.2下面用的是Zortech C/C++,1.3下面用的又是C/2,到了2.0/2.1又改了(2.1以后的确是稳定了,但是也太晚了,因为OS/2已经输给了Windows)。我在OS/2下面其实就干了一个项目,但是却用了三种编译器,改了五次,赚了五次钱。

Zortech C/C++是个很有趣的开发环境,它支持跨平台开发,也支持DOS扩展(包括调试),这两点要比当时主流的编译器,如microsoft和borland要强。它的用户界面不如turbo c++,但是比microsoft的msc系列强多了。我在做使用了DOS扩展的应用程序时主要靠它,而在做标准程序的时候则使用turbo c/msc这个组合,反正都是盗版。

还是Unix下面的活最干净,翻来覆去就是cc和make,没别的了。

家园 的确如此

Java比较缓慢的原因一个是它的JVM,一个是它的过分OO,而.Net的CLR的性能要明显好于JVM,而C#的倾向于C++也给它的性能优势增色不少。

去年年底,我曾经针对同样的Data Mining算法分别用C++、C#和Java来实现以比较它们的性能,发现C++自然是最好的,C#差一些,但是距离不是很大,而Java就太差了。那个实现使用的数据有百万笔交易、平均交易涉及货品种类大约四十,数据总量一百五十兆,使用内存大约五百兆,在一台内存一G的Windows XP Pro上运行,HotSpot使用了服务器选项,内存给到了768M。

您说得对,C#的delegate更象C++的function pointer,而不是Design Patterns里面的delegate;Java的interface只是类的公共对外接口,以利于多态,和delegate没有关系。

其实Java也需要和宿主操作系统的交流,JNI就是为这个目的设计的。网上也有一些从Java访问COM的类库。

COM和Java自然是两类东西,但是COM+和J2EE的结构倒是有互相抄袭之嫌。

说到generic programming,Java 1.5依循的是C++ templete的预编译路子,这样就不需要对JVM的修改,至少对Beta版是这样的;而.Net诸语言是通过扩充CTS/CLR来实现的,好处是可以做到Component一级的templete复用,缺点是CTS/CLR的兼容性,至少目前我手里没有能够反编译.Net Framework 1.2的工具。

家园 一语中的

编辑用Borland C/C++,而编译用MSC/C++。呵呵!

都是这样的过来人。当时写个MSC/C++的Makefile

也挺头大的。到了VC1.0出来,就没有人再用Borland

的东西了。

家园 C#里没有指针。

否则,Garbage Collection的实现就很困难。

delegate类似function pointer,但不是

指针。

家园 你说的是微软的C#吗?这里是指针(pointer)的使用说明。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/csspec/html/vclrfcsharpspec_A_2.asp

C#的指针在Unsafe Block中使用,叫Unsafe code

The core C# language, as defined in the preceding chapters, differs notably from C and C++ in its omission of pointers as a data type. Instead, C# provides references and the ability to create objects that are managed by a garbage collector. This design, coupled with other features, makes C# a much safer language than C or C++. In the core C# language it is simply not possible to have an uninitialized variable, a "dangling" pointer, or an expression that indexes an array beyond its bounds. Whole categories of bugs that routinely plague C and C++ programs are thus eliminated.

While practically every pointer type construct in C or C++ has a reference type counterpart in C#, nonetheless, there are situations where access to pointer types becomes a necessity. For example, interfacing with the underlying operating system, accessing a memory-mapped device, or implementing a time-critical algorithm may not be possible or practical without access to pointers. To address this need, C# provides the ability to write unsafe code.

In unsafe code it is possible to declare and operate on pointers, to perform conversions between pointers and integral types, to take the address of variables, and so forth. In a sense, writing unsafe code is much like writing C code within a C# program.

Unsafe code is in fact a "safe" feature from the perspective of both developers and users. Unsafe code must be clearly marked with the modifier unsafe, so developers can't possibly use unsafe features accidentally, and the execution engine works to ensure that unsafe code cannot be executed in an untrusted environment.

顺便看一个小例子

using System;

class Test

{

static int value = 20;

unsafe static void F(out int* pi1, ref int* pi2) {

int i = 10;

pi1 = &i;

fixed (int* pj = &value) {

// ...

pi2 = pj;

}

}

static void Main() {

int i = 10;

unsafe {

int* px1;

int* px2 = &i;

F(out px1, ref px2);

Console.WriteLine("*px1 = {0}, *px2 = {1}",

*px1, *px2); // undefined behavior

}

}

}

家园 .Net下面的Garbage Collection和Java的不太一样

Java没有析构函数,完全依靠Garbage Collection来回收资源;其实这也是JNI的命门所在,因为这里恰恰是Java和外界沟通的通道,涉及了外界资源的释放问题。而.Net因为涉及的资源比较复杂,完全使用Garbage Collection是不现实的,因此需要析构函数来完成非.Net资源的释放。

C#下面的指针使用是受限制的,而Delegate起到了函数指针的作用。在这一点上,我觉得微软做得不好,干脆彻底实现delegate pattern不就得了,那样更彻底一些,反正.Net Framework里面已经使用了不少的patterns。读.Net Framework Documents的家伙一定要精通Design Patterns这本书,否则会很难过的。

家园 这倒不知道。多谢!

从来没在C#里用过pointer。

不过不知道,这个Unsafe code是不是在

Managed heap上的,是不是由GC来handle的。

如果是Unmanaged,那就等于是像C#里嵌

C,就像C/C++里嵌汇编一样。

家园 C#里的pointer不由GC管理。你的想法是正确的。

其实微软也不建议使用pointer,除非你有什么特殊情形。

家园 微软的模仿和商业手段在哪个领域都可怕

最近的好像是在XBOX游戏机上面了。我知道的情况是,XBOX的内核和WINDOWS2000类似,所以在PC上的游戏可以做所谓的“跨平台”到XBOX上,又给将来的XBOX从PS2手上抢下一片天地打下了基础。

好在,微软的模仿和商业手段+其他公司的另类和创新,从真正意义上导致大众的科技享受。估计多少也有这个原因在,虽然事实上垄断了,但是并没有阻止竞争和科技发展,所以没被判“垄断”。

家园 C++领域李维可是说错了

老铁的道理是对的,但是这篇文章李维给Borland涂脂抹粉的也太过了。

我不知道李维真实的水平如何,但是就这篇文章而言,他在胡勒。

全看树展主题 · 分页首页 上页
/ 2
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河