• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            西城

            指尖代碼,手上年華

            聯(lián)系 聚合 管理
              20 Posts :: 0 Stories :: 62 Comments :: 0 Trackbacks
            這一陣在看CORBA,想找一個優(yōu)秀的開源實現并不容易。MICO性能太差,沒有考慮,omniORB還好,只是配置著有點麻煩,
            Naming Service那部分用了好長時間也沒讓程序成功運行。orbit差不多是所有的實現里面最為高效的一個,因為它是
            用C實現的,主要的綁定語言是C和perl。GNOME項目組正在用它。至少從實用性角度看,它要比omniORB好的多。
            在看其中的例子時,發(fā)現了在一些問題的處理上,C的實現非常高效,而且并不復雜。相比之下,
            C++則顯得有點臃腫,效率低下。
            第一個問題:類的實現。
            C語言里沒有類的概念,而IDL定義的接口則需要實現類似于對象的概念。C中的方法是將類作為方法的前綴,因為我們
            最終調用的還是方法,而將類作為函數名的前綴之后,就能保證方法名字的唯一,因為類名是不同的,一個類中的函數
            名也是不同的。這樣就大大降低了開銷,所有的一切都是通過函數調用來完成的。
            比如
            CORBA_ORB類中的resolve_initial_references方法,若參數是“RootPOA”
            則C中的實現是
            CORBA_ORB_resolve_initial_references(*orb,"RootPOA",ev);
            其中第一個參數就是調用此方法(resolve_initial_references)的類,第三個參數就是我所說的第二個問題:異常處理。
            C++中引入了throw...catch控制接口和exception類。優(yōu)點自不待言,缺點卻也不少,效率損失,程序結構的混亂。
            在C的大部分函數中,我們可以看到另一種解決方法——額外的參數。
            通過附加一個額外的參數來表明錯誤,然后檢測錯誤,這樣的開銷比用throw....catch小的多,而且沒有破壞程序
            結構。
            C雖然只是一種面向過程的語言,沒有那么多的“高級特性”,但通過各種封裝,在不損失語言的簡潔和高效的同時,
            C的實現也是有很多優(yōu)點的。這也是為什么C總能穩(wěn)居語言排行榜的第二位的原因。
            posted on 2012-03-24 22:55 西城 閱讀(1756) 評論(26)  編輯 收藏 引用 所屬分類: C/C++

            Feedback

            # re: C和C++在兩個小問題上的對比 2012-03-26 00:27 陳梓瀚(vczh)
            你雖然論證了C++編譯時間慢,但是這絲毫不影響運行時效率啊。而且C++封裝層次高,所以你正確使用C++寫一個程序,花的時間要比C少很多,就算加上慢的編譯速度,也是更劃算的。

            舉個例子“這樣就大大降低了開銷,所有的一切都是通過函數調用來完成的。
            ”。沒錯,這有開銷,但這個開銷是在編譯器里面的,最終生成的運行時代碼,還是跟C語言一樣。一次性的東西都不用管它。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-26 10:50 墨魂
            @陳梓瀚(vczh)
            但從orbit與omniORB的實現來說,我覺得還是C的實現更好,因為你用orbit寫分布式程序時,最終服務器端的大部分代碼都直接有orbit幫你生成,你只用寫你需要實現的功能這一塊就好。但omniORB卻全是要自己手動去寫。運行時代碼是和C一樣,但throw...catch這樣的代碼一直都在程序中,不僅影響程序邏輯,在實現上也比直接傳一個參數低效的多  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-26 10:59 zjh
            @陳梓瀚(vczh)
            正確使用C++寫一個程序,花的時間要比C少很多
            正確使用c++比正確使用c,所花費的時間是不可等日耳語的
            不敢茍同,c++太復雜了,稍不留神,就有可能出錯,效率低下,只要看看c++出版了那么多書籍就知道了,至今沒有一個編譯器能完全實現標準c++,也說明c++過于復雜
              回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-26 15:27 陳梓瀚(vczh)
            你要是非要拿一個類庫來說,那我也可以說我山寨過一個boost::spirit,那種優(yōu)美兼高效的parser寫法,C永遠都做不到呢。這有什么意思。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-26 15:29 陳梓瀚(vczh)
            @zjh
            學習C++是一次性的,而寫C語言程序則是每一次都要做的事情。你這么比較不公平。一個更極端的例子,你花更多的時間去學習haskell,后面每一個程序的尺寸,可能是C語言的1/30,而且健壯性基本不用care因為語言保證了你很難不健壯,性能也不差。這個開發(fā)效率高不高,當然是算總的時間,豈能算一個程序的時間?  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-26 15:37 墨魂
            @陳梓瀚(vczh)
            我是從一個類庫開始說,但并不是只是這一個類庫這樣。比如QT和GTK相比,明顯QT的效率要比GTK相比要低的多。我比較的重點只是運行的性能還有就是錯誤處理那一塊的效率,至于你說的那些優(yōu)美與高效的寫法,如果與同樣的C實現相比,也不一定就見得高效與優(yōu)美。
              回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 09:12 Chipset
            C語法和用法相對比較簡單,C++語法和用法相對復雜,或者說看你會不會用C++罷了。小程序比較快慢沒有意義,上下差不了幾個毫秒,可以看成誤差。我們還是比個比較大的程序吧,你覺得最新的Linux系統(tǒng)顯著比最新的Windows快嗎?前者是C寫的,后者是C++寫的。測試了很多項,都是常用的,除了文件讀寫外(EXT4對NTFS,個人覺得是格式問題),其它項Linux全軍覆沒。在Linux一個網站上比較的Ubantu和Win7,自己谷歌一下吧,我不解釋。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 09:43 Chipset
            http://www.phoronix.com/scan.php?page=home
            這里有很多比較,有硬件的,也有軟件的。
            至于你文中提到的C++拋出異常,我真想知道有多大開銷,問題是你拋什么異常,怎么拋異常,怎么處理異常。根據經驗,異常處理會難倒很多C++老手,所以我懷疑你怎么使用異常,會不會很好的使用。
            C語言穩(wěn)居什么排行榜的事情跟效率有關嗎?既然C那么好用為何比排名第一呢?你不覺得你那種論斷荒唐嗎?
            至于你提到的圖形庫,GTK+和QT,這玩意怎么比呀。作出的圖形不同的畫質計算量會千差萬別。都是用C寫的界面,GNOME和XFCE速度相差很大,這怎么解釋。即使如此,KDE也未必比Gnome慢哪里去,還在上面那個鏈接,你自己看。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 11:53 zjh
            @Chipset
            誰告訴你windows是用c++編寫的,windows內核也是用c和匯編寫的  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 12:43 Chipset
            唉,我說樓上的那位。Win內核是用C++寫的,少量Intel匯編,你去問微軟的架構師好了,我不解釋。。。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 12:53 墨魂
            @Chipset
            ubuntu并不能代表LINUX,它只是一個類似WINDOWS的傻瓜化的操作系統(tǒng)。
            WINDOWS和INTEL的聯(lián)盟使得WINDOWS針對x86平臺進行優(yōu)化,但LINUX沒有這樣的支持,而且linux要支持各種硬件平臺,所以代碼要盡量通用,可移植,當然在某些方面比不過只做x86的windows.  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 12:54 Chipset
            @zjh
            順便給你掃盲一下吧。微軟的所有產品(除了.net框架的一部分基類用了C#),其余是一色的C++程序,就連C#編譯器都不例外,當然了,個別地方有點Intel匯編。
            若干年前Windows Phone上嘗試了一下用C#寫了個軟鍵盤程序,發(fā)現速度太慢,最終只好又退回到C++。DOS是用匯編寫的,從Win95以后,都是C++代碼外加少量匯編。Win2K的代碼泄漏過一次,不知道現在網上是否還能下載到,是用C++寫的,這個能看到。

            不要覺得WinAPI是些C代碼就認為Win內核是用C寫的,你可以去問微軟的架構師。。。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 12:59 墨魂
            @Chipset
            KDE的內存占用要比Gnome大很多,這是我自己測得的結果。如果KDE真如你說的那么好,各大發(fā)行版為什么都默認的是GNOME而不是KDE,連SUSE在12.1都是。C不是第一,只是因為相對于JAVA來說,C還是太難。愿意學下去的太少。不過3月分的語言排行榜你應該看過,JAVA--17.110%,比上月下滑2.60%,C占
            17.087%,上漲1.82%,這總不會是無緣無故的。C++8.074%,下滑0.71%,并不說C++不好,只是有太多自以為是的C++程序員了。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 13:31 Chipset
            @墨魂
            唉,那個排名能說明個啥呀,跟效率沒關系是不是?
            其實C++和C速度上沒差別,你可以看下struct和class的內存布局,內存布局都一樣,哪來的速度差別呀。。。
            C++唯一慢的地方是虛函數(C沒有),需要查虛表,就一兩條指令的開銷帶來的好處是不言而喻的。。。
            至于Gnome和KDE,畫面質量不同,內存和計算量相差那么大,比速度和內存有意思嗎?你咋不拿控制臺給Metro比速度和內存呀。。。
            C++是有很多缺點被很多人指責,編譯慢,語法太復雜,新手很容易寫出爛代碼。。。這都是真的,但是不恰恰說明很多人在用C++嗎?否則怎么可能發(fā)現這么多問題呢。。。就如同我們天天罵windows一樣,你見過幾個人罵Linux?沒有幾個人用,哪里能發(fā)現那么多問題。。。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 13:35 Chipset
            @墨魂
            如果你還要比,我還能給你舉出更多例子說明C++比C快,耗費內存也少,如果有人說C++比C快耗費內存少,我同樣也能舉出很多反面的例子。。。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 15:13 zjh
            @Chipset
            你是不是想說微軟的C編譯器和鏈接器也是c++寫的?,操作系統(tǒng)內核從來也沒有用c++寫過,注意是內核,不是操作系統(tǒng),windows是微內核。
            不巧,我還真有win2k的源代碼,要不要貼上來讓你看看? 先給自己掃盲吧  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 16:13 Chipset
            @zjh
            建議你谷歌一下吧,或問微軟的架構師,感覺這玩意沒啥好爭論的。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-27 16:31 Chipset
            就說NT吧,不是微(micro)內核,也不是單(monolithic)內核,應該算Hybrid。你可以搜索到NT架構,我也不清楚你說哪一部分。HAL層我估計應該用匯編,據說這些匯編主要來自一個祖籍臺灣人的貢獻(你可以了解一下微軟的歷史,那幾個技術鼻祖)。再上面一層(Kernel mode drivers 和 micro kernel),古老的代碼應該是C寫的,后來改寫的代碼是C++的,再上面也是這樣,古老的代碼是C的,后來的是C++的。其實不僅Windows,Office也是這樣的,最古老的代碼是匯編,后來的用C,C++出現以后所有的新東西都用C++來寫。你不是有win2k代碼嗎,你最好找到我說的那一層看看是不是這樣。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 16:48 Chipset
            @zjh
            這里有個簡要的圖和介紹,我不明白你指代那一部分:
            http://en.wikipedia.org/wiki/Architecture_of_Windows_NT

            用C++寫操作系統(tǒng)內核不是新聞,用Java寫的都有。。。

            這里有用什么語言編寫的介紹:
            http://www.lextrait.com/vincent/implementations.html
            這里也可以查到:
            http://www2.research.att.com/~bs/applications.html
              回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 17:48 墨魂
            @Chipset
            GNOME和KDE的差別有多大,你如果真的拿命令行和win8的那個什么界面比。我也沒什么可說的。GNOME3.2和KDE4.7是差不多同時的產品,你自己可以去看他們之間究竟是不是有你所說的那么大的差別。

            你之前說排名沒用,現在又來說C++有那么多人用,那這又有什么用?我覺得排名里C++不斷下滑是有原因的,你若覺得沒什么問題也罷。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-27 19:19 zjh
            @Chipset
            你說什么就是什么吧,反正我手里的win2k源代碼不是c++的,難道是盜版?
            java寫操作系統(tǒng),是畢業(yè)設計么? 也許等到芯片的計算能力大大提高后,可以吧java虛擬機固化到芯片,就可以用java寫操作系統(tǒng)
            摘錄一段代碼
            VOID
            KiInitSystem (
            VOID
            )

            /*++

            Routine Description:

            This function initializes architecture independent kernel structures.

            Arguments:

            None.

            Return Value:

            None.

            --*/

            {

            ULONG Index;

            //
            // Initialize dispatcher ready queue listheads.
            //

            for (Index = 0; Index < MAXIMUM_PRIORITY; Index += 1) {
            InitializeListHead(&KiDispatcherReadyListHead[Index]);
            }

            //
            // Initialize bug check callback listhead and spinlock.
            //

            InitializeListHead(&KeBugCheckCallbackListHead);
            KeInitializeSpinLock(&KeBugCheckCallbackLock);

            //
            // Initialize the timer expiration DPC object.
            //

            KeInitializeDpc(&KiTimerExpireDpc,
            (PKDEFERRED_ROUTINE)KiTimerExpiration, NIL);

            //
            // Initialize the profile listhead and profile locks
            //

            KeInitializeSpinLock(&KiProfileLock);
            InitializeListHead(&KiProfileListHead);

            //
            // Initialize the active profile source listhead.
            //

            InitializeListHead(&KiProfileSourceListHead);

            //
            // Initialize the timer table, the timer completion listhead, and the
            // timer completion DPC.
            //

            for (Index = 0; Index < TIMER_TABLE_SIZE; Index += 1) {
            InitializeListHead(&KiTimerTableListHead[Index]);
            }

            //
            // Initialize the swap event, the process inswap listhead, the
            // process outswap listhead, the kernel stack inswap listhead,
            // the wait in listhead, and the wait out listhead.
            //

            KeInitializeEvent(&KiSwapEvent,
            SynchronizationEvent,
            FALSE);

            InitializeListHead(&KiProcessInSwapListHead);
            InitializeListHead(&KiProcessOutSwapListHead);
            InitializeListHead(&KiStackInSwapListHead);
            InitializeListHead(&KiWaitInListHead);
            InitializeListHead(&KiWaitOutListHead);

            //
            // Initialize the system service descriptor table.
            //

            KeServiceDescriptorTable[0].Base = &KiServiceTable[0];
            KeServiceDescriptorTable[0].Count = NULL;
            KeServiceDescriptorTable[0].Limit = KiServiceLimit;
            #if defined(_IA64_)

            //
            // The global pointer associated with the table base is
            // placed just before the service table.
            //

            KeServiceDescriptorTable[0].TableBaseGpOffset =
            (LONG)(*(KiServiceTable-1) - (ULONG_PTR)KiServiceTable);
            #endif
            KeServiceDescriptorTable[0].Number = &KiArgumentTable[0];
            for (Index = 1; Index < NUMBER_SERVICE_TABLES; Index += 1) {
            KeServiceDescriptorTable[Index].Limit = 0;
            }

            //
            // Copy the system service descriptor table to the shadow table
            // which is used to record the Win32 system services.
            //

            RtlCopyMemory(KeServiceDescriptorTableShadow,
            KeServiceDescriptorTable,
            sizeof(KeServiceDescriptorTable));

            //
            // Initialize call performance data structures.
            //

            #if defined(_COLLECT_FLUSH_SINGLE_CALLDATA_)

            ExInitializeCallData(&KiFlushSingleCallData);

            #endif

            #if defined(_COLLECT_SET_EVENT_CALLDATA_)

            ExInitializeCallData(&KiSetEventCallData);

            #endif

            #if defined(_COLLECT_WAIT_SINGLE_CALLDATA_)

            ExInitializeCallData(&KiWaitSingleCallData);

            #endif

            return;
            }
              回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-28 09:20 Chipset
            @zjh
            Java寫系統(tǒng)還真有,也不是什么畢業(yè)設計。你可以谷歌下JNode,除了一點匯編,其它全是用Java寫的。
            至于你說把虛擬機固化到芯片里,雖然我沒見哪家這么干,但是我確實聽說有的ARM芯片可以直接執(zhí)行字節(jié)碼。

            我們做嵌入式,芯片的計算能力非常有限,內存也跟臺式機沒得比,是很在乎資源消耗的。以前一直認為C++比C慢很多,耗費資源也多,關于C和C++之間的速度差別查閱了很多資料,評測過N次,發(fā)現幾乎沒啥差別。

            C++的缺點是很明顯的,新手很容易寫出垃圾代碼,速度慢耗費內存多,但優(yōu)點也很明顯。我們目前做的一個程序大約2百萬行源代碼,C++代碼大約90%以上,C代碼大約5%,還有1%不到的Lua。如果C++的部分也用C來做,你想想源代碼量會有多大,維護起來會有多痛苦...  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-28 09:33 Chipset
            @墨魂
            Gnome和Xfce都用C,但是速度差別那么大怎么解釋?很多事情跟語言關系不大對不對。再舉個例子,Chrome,FireFox,IE都用C++來寫,速度和資源消耗是不是也差別很大?這又怎么解釋?
            我再舉個例子吧,MTL聽說過吧,做計算的。做數值計算,C和C++沒法跟Fortran比速度,同樣的算法,速度得差20%,但是MTL開發(fā)出來后,尤其4.0以后把Fortran都秒飛了,你能說C++不行?那為啥不用C來做,如果C真的那么快?

            任何語言都有優(yōu)點和缺點,否則某種語言早就一統(tǒng)江湖了。。。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-28 11:17 墨魂
            @Chipset
            我沒有說過C就一定比C++好,問題都是在庫的設計上,C++的庫設計的不好會有性能損耗,設計的好的話跟C比也會很多優(yōu)勢。

            MTL是很好,但沒有用C來做 就不是說用C不行。只是剛好這個庫用C++來寫了而已。  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比[未登錄] 2012-03-28 16:04 Chipset
            @墨魂
            Gnome和KDE都是應用,Linus Torvalds也在公開場合說過KDE做的很不錯,否則在那個C的世界KDE早死了。

            Qt的版本升級很快,看來很多人在用(如果沒幾個人用那還有必要頻繁升級嗎?)再想想Qt商業(yè)應用得花錢買版權,如果Qt跟GTK+比真的那么差,誰愿意花錢買不好的東西呢?用免費的GTK+(C)或gtkmm(給C++用)豈不更好?

            順便說下zjh貼的那段代碼,我真看不出是C的。C89和C94沒有//的注釋符號,C99的規(guī)定是何年月啦,微軟的編譯器哪里能升級那么快?Win2K能趕得上嗎?  回復  更多評論
              

            # re: C和C++在兩個小問題上的對比 2012-03-28 16:33 墨魂
            @Chipset
            QT主要是功能較為豐富,而GTK+主要是做界面。再者KDE出來的比較早,GNOME只是不滿于KDE的設計而成立的。所以單論界面來說,GNOME并不比KDE差,再者KDE設計的太過復雜,并不符合一般用戶的使用習慣,所以GNOME會后來居上。  回復  更多評論
              

            精品久久久久久国产91| 久久精品水蜜桃av综合天堂| 久久免费高清视频| 国产精品中文久久久久久久| 狠狠久久亚洲欧美专区| 91精品国产色综久久| 99久久久精品| 久久久久亚洲av无码专区| 亚洲午夜久久影院| 久久久久久精品免费免费自慰| 久久精品国产99久久久香蕉| 精品国产一区二区三区久久| 亚洲色欲久久久久综合网| 久久99精品久久久久久秒播| 伊人久久综合热线大杳蕉下载| 无码精品久久一区二区三区| 久久一区二区三区免费| 久久综合给合综合久久| 韩国免费A级毛片久久| 国产韩国精品一区二区三区久久| 久久天天躁狠狠躁夜夜av浪潮| 色欲av伊人久久大香线蕉影院 | 精品国产综合区久久久久久| 久久香蕉国产线看观看精品yw| 久久亚洲AV无码西西人体| 日本久久久精品中文字幕| 少妇久久久久久久久久| 久久精品国产亚洲av麻豆蜜芽| 久久久久国产一区二区三区| 97久久久久人妻精品专区| 午夜天堂av天堂久久久| 囯产精品久久久久久久久蜜桃 | 91精品观看91久久久久久 | 大蕉久久伊人中文字幕| 久久露脸国产精品| 国产三级精品久久| 91精品国产综合久久四虎久久无码一级 | 久久婷婷五月综合色99啪ak| 久久精品成人免费国产片小草| 精品久久久久中文字幕一区| 久久久久亚洲AV成人网|