另,正在做提案去error-code化,加exception的體系設計。
但是做嵌入式,大家都很敏感,所以還是要先把現在所用的平臺和編譯環境中,exception空間和時間開銷分析清楚給客戶。目前還在整,感覺時間開銷上完全沒有問題(特別是normal case中,異常時其實慢一點也無所謂了,因為設計中的異常真的是非常非常地異常!),但代碼膨脹還是有點點擔心(因為存儲空間比較有限)。不知道 MS 是不是有這方面的數據?特別是WinCE500方面……
異常處理這段深有同感。
現在做的系統中流用了大量的C代碼,全部是error-check方式。
只能說,用error-check大部情況下只是“掩耳盜鈴”而已,Check一下函數出錯了就打個屏,完全沒有想過是否可能恢復,如何恢復,也沒有辦法想,error-code根本就傳不出去。
所以軟件“品質”就成了“測出來的”,而不是設計出來的了,因為設計的時候根本就無法處理這么復雜的層次的函數調用帶來的錯誤碼,而且中間只要有人不傳遞就完蛋了。
信了樓主的體驗,升級了工程(當然,偶是下的“試用”)
智能提示很慢,和VC助手的功能相比差距還是很明顯啊
不過2012啟動還是很快的。
雖然如此,還是受不了沒有助手的生活。
果斷退回
re: “三流學校的學生又來了” 唐風 2010-08-28 14:23
@chaogu
郁悶的是地大被定義為三流~而你還來一個“我是三流學校的怎么樣”
我可沒有因為自己是地大的而有覺得有什么好郁悶的。我還是很懷念地大的生活的,呵呵。
re: “三流學校的學生又來了” 唐風 2010-08-28 00:00
看了你的自我介紹,中國地質大學的校友郁悶地飄過~~~
@Tanky Woo
用Windows Live Writer寫,再發布,有圖的文章尤其方便撒~!
@空明流轉
興趣是有,圖形知識幾乎為0.
好吧,我申請去給你們打打雜~!
看你們收不?
re: 關于C++之“復雜” 唐風 2010-07-10 21:29
不記得是在哪里看到的了,大意是:
一個優秀程序員要掌握的知識無論使用哪些語言都是差不多的,不同的地方在于:使用C++的話,你必須把它們大部都學會了,你才能動手做一些有實際意義的東西,(否則你將面臨著一大堆的陷阱)。而Java/C#等,則可以把學習的“時間”平攤,在你沒有“完全”掌握這些知識之前,你已經可以做一些實際的東西出來了(雖然這個時候還稱不上是“優秀”的程序員)。
我覺得,C++所謂的復雜性,大約就是這樣。
PS:把Java/C#放在這里并不想引起爭論。但是我想,如果世界只有一門語言的話,大概沒有誰會“抱怨”它的復雜性。要說它復雜,那是比起其它語言的“感覺”。所以,不比較是不可能的……好糾結
re: 代理服務器的簡單實現 唐風 2010-06-28 08:43
很少見到博客正文用楷體的,呵,不過博主的排版還是很漂亮的。
文章也讓我受教了。謝謝!
re: 模仿學習的困局 唐風 2010-06-09 23:24
我只是模仿個 AGG ,亦有同感了。
唉
唉,還是希望出現語言級別的“糖”,還是希望有 initializer-list ……
re: 算法導論評 唐風 2010-05-29 22:34
這篇書評寫得非常棒!!
不過我覺得《算法導論》中的偽碼還是挺漂亮的,呵呵。
可惜我只看完圖算法就停下來了,習題基本沒做,買櫝還珠了,主要是沒有你這樣的毅力。PF你~!
gay……呵呵,搞錯詞了不老大~!
多用用標準庫就更好了。
re: 對 C++ 歷史的個人觀點 唐風 2010-04-07 20:50
@OwnWaterloo
很精彩,呵呵。
關于allocator這段,我看得很仔細,因為,在TopLanguage里,有一個主題是《{技術}{C++} 突然有一種想法:將文本文件讀入vector可以跨過push_back()嗎》
http://groups.google.com/group/pongba/browse_thread/thread/ebb85b7e927c1af9/aebc1741ed60b2f5?hl=zh-CN&lnk=gst&q=%E7%AA%81%E7%84%B6%E6%9C%89%E4%B8%80%E7%A7%8D%E6%83%B3%E6%B3%95%EF%BC%9A%E5%B0%86%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%E8%AF%BB%E5%85%A5vector%E5%8F%AF%E4%BB%A5%E8%B7%A8%E8%BF%87push_back()%E5%90%97#
我在里面表達了與OwnWaterloo同樣的觀點,但我的認證和說明膚淺多了。我剛剛還特別翻了下,發現當時的“辯方對友”居然正是樓主,世界太小了(樓主也是牛人,哪都見得到滴說)。
在這個問題上,我與OwnWaterloo相同,并從他的回答中又學到不少東西。我喜歡這樣的“技術論戰”,因為它總是能讓人進步,呵呵。向樓主,和OwnWaterloo學習。
re: [翻譯]高效使用auto_ptr 唐風 2010-04-07 20:32
@giscn
給些例子或是一些鏈接不咧
我贊同本文的觀點,但同時很想知道“遠離 auto_ptr” 的理由是否也能說明我。
謝謝了。
re: 成熟 余秋雨 唐風 2010-04-04 13:48
@abilitytao
余的《文化苦旅》和《山居筆記》都灰常好看,高中的時候曾經很迷,哈哈。
現在覺得他更像娛樂圈的人了……
re: 成熟 余秋雨 唐風 2010-04-03 22:43
我記得我背過這段,呵呵。
re: 蘇東坡突圍 —余秋雨 唐風 2010-04-03 22:42
《山居筆記》里的吧
俺也挺喜歡看,高中時候的事兒了……唉,一恍7、8年。
@Uniker
看樣子您像是只看了標題沒看內容……
re: MFC中一個危險的Bug 唐風 2010-03-28 11:17
1. 遺留代碼不可替代
2. 升級開發環境的預算和必要性
3. 有決策權開發人員的“技術慣性”
使得VC6到現在還這么有“生命”力。感覺就像IE6一樣,哈哈,有種種的不好,可偏還是有那么多用戶。
反正我是等VS2010出來就準備XX的,嘿嘿。
re: 虛驚一場的海嘯 唐風 2010-03-08 05:20
哈哈,期待下篇 Bug 解析!!
@陳梓瀚(vczh)
陳版 .net ?
哈哈~~~~
re: C++雜感 唐風 2009-12-25 07:36
“像貴國的等級考試這類的考察語言偏僻細節上”?
請問閣下哪國人?
路過……
:)
@Vitacy.Tan
話又說回來,在你的做法中,并沒有直接在 function pointer 和 void* 之間進行轉型,而是為 function pointer 創建(new)了一個對象,賦給 void*,這樣做我感覺是沒有問題的,這時候 void* 指向的仍然是一個“對象”,呵呵。
但這么做可能在“效率”上不如直接備份 function pointer 。畢竟,創建時候的 new 和調用時的轉型加最后的 delete,都比直接存 function pointer 負擔大。但這樣做獲得了代碼上的一致性,我倒是挺喜歡的,呵呵(如果確實沒有“我所不知道的問題的話”)。
@Vitacy.Tan
在網上找了一下相關的資料,發現這個問題其實已經有了比較多的“討論”,還有專門論述的文章:
http://www.safercode.com/blog/2008/11/25/generic-function-pointers-in-c-and-void.html
簡而言之,就是:
不能 void* 和 void(*f)() 合并成一個,原因是對于 C 標準而言,這兩個“東西”并不保證一致,函數指針的大小可能比 void* (也就是指向數據的指針大小要大),可能會包含更多的信息,如果在這之間進行轉換的話,在某些平臺會產生未定義的行為(在 Windows 平臺下,這樣做是沒問題的,參考
http://stackoverflow.com/questions/1867698/casting-a-void-pointer-data-to-a-function-pointer 中的回復)。因此,這么做是為了可移植性的考慮。
相關原文如下:
Why can’t we use void* for a Generic Function Pointer?
This is because a void* is a pointer to a generic “data” type. A void * is used to denote pointers to objects and in some systems, pointers to functions can be larger than pointers to objects. So, if you convert amongst them, you’ll lose information and hence, the situation would be undefined and implementation dependent. Most compilers won’t even warn you if you convert between them but some might error out, if you try to call such a void * to function pointer converted. But even they might fail to alert you, if you take care of typecasting the call perfectly (Enclose in parentheses before function call brackets). And then, one fine day, you’ll try to compile and run your program on one of the aforementioned systems, and then keep on wondering why your program segfaults.
Note: C++ does allow this “conditionally” which means that such a conversion is allowed but a compiler is not bound to implement this feature, which again makes its usage circumspect.
另外,我還是不太明白,function pointer 可能攜帶的其它信息是什么,呵呵,再查查嘍。
謝謝 Vitacy.Tan 的回復,讓我能更深入的了解這方面的知識。
嗯,有人能參與討論就是好啊,希望大家多指點。
唐
re: ACM主要算法 唐風 2009-12-12 23:45
謝謝你的總結!!
真是太好了,正在找這樣的資料,呵呵
re: C++類定義中應該允許設置默認值 唐風 2009-12-12 16:03
C++0x 中貌似可以。
確實是一種很合理也很有用的初始化方式。
re: 數據結構課程設計--圖書管理系統 唐風 2009-12-08 20:58
記得以前也做過樣的的東東,貌似是自己第一個PC程序呢,哈哈。
用C從頭做起,能練練數據結構(主要是鏈表)。用C++/Java/C#等容器類,那就沒什么搞頭了,呵呵
>code3 錯誤的原因為, vecFiles.erase(it_pos); 當前的it_pos已經被刪除
>了, 再下一次循環的時候 it_pos++, 訪問非法內存..
>然后回過頭來看code1, vecFiles.erase(it_pos++); 在當前的it_pos已經被
>刪除的時候, it_pos已經指向下一個位置了. 雖然這里邏輯上是錯誤的. 但是利
>用c語法的特性產生了一個正確的結果, 算是一個技巧. 不算是一門技術.
我對這種的說法有不同看法:
it_pos無所謂刪除不刪除,it_pos 的行為就像指針一樣,指針本身不會被刪除,被刪除的是指針指向的內容。我想樓主可能對迭代器失效的理解有偏差(建議在網上查一查相關的資料再看看)
我覺得,code1、2、3沒有什么本質區別,都有可能產生迭代器失效的問題。
一個原則:對vector只要做了刪除或是增加動作,就要示迭代器已經無效,必須重新從vector對象獲取新的迭代器的值,而不能用臨時變量、后綴自增等方法……
remove_if+erase的版本才是可讀性最好且沒什么問題的。
個人愚見,請博主笑納……
re: 與臨時對象的斗爭(下) 唐風 2009-12-08 18:15
@陳梓瀚(vczh)
好吧,我只能說,是你自己在 cppblog 的鏈接中列出來的。哈哈哈哈 :P
閣下愛好很廣嘛,編譯原理狂人(別人這么叫你的) + 漫迷 ……
嗯嗯,凡有回復必回訪是我的原則,哈哈,也是想通這這種途徑了解對方,多交些朋友
re: 與臨時對象的斗爭(下) 唐風 2009-12-07 19:24
@Wang Feng
確實如你所言。謝謝你的回復。
說實話,“并行計算”這種高級貨,我還真沒玩過,嘿嘿。
嗯嗯,真心求教:
這方面有沒有比較好的已經成熟的做法(庫?)?能不能介紹一下?如果一個表達式比較復雜(比如有加減乘、有括號之類)有什么算法能正確地最優地根據可以并行的“行程”數來分配計算子過程?各子過程的之間的“通信”是怎么做的呢?會像一般“多線程”中的鎖機制那樣嗎(當然,我對鎖這東西的理解也限于“理論”范疇內,呵呵)?
PS:
剛才回訪了你的 blog,里面大多都是算法方面的東西啊,呵呵。向你學習 :D
re: 與臨時對象的斗爭(上) 唐風 2009-12-06 22:25
@YESHG!
你也注冊一個博客園(或是cppblog)的帳戶唄
對評論和回復有郵件通知,這個功能挺好用的。
re: 聽Lippman講座 唐風 2009-12-05 19:56
【他只是謙虛地說:他只是對C++比較了解,在其他領域,他可能還不如在座諸位。】
光這一點就讓我肅然起敬。
re: 與臨時對象的斗爭(下) 唐風 2009-12-04 18:51
@OwnWaterloo
operation proxy……
好形象啊,哈哈
你上篇的回復里就說到了這個呢,不過我是事后才認識到……:P
re: 與臨時對象的斗爭(下) 唐風 2009-12-04 18:49
@YESHG!
謝謝老大支持!!
配合內聯 RVO,很多情況下這些臨時小對象也可以消失,你看看我上面回復中給的鏈接,MS 有說明……
至于不習慣模板,嘿嘿,吐啊吐啊就習慣了。:)
re: 與臨時對象的斗爭(下) 唐風 2009-12-04 18:41
@陳梓瀚(vczh)
嗯嗯,好敏銳啊,你說得很對。
d=a+(b+c);
這種在這段程序里是會產生編譯錯誤的……
這個模板類確實非常的不完善,對于一個“可用”的ExpXXX的話,應該要是左右操作數都需要泛化的。為了進一步的重用,可以再泛化操作類型(加減乘)。
這篇文章里我想把重點放在“它可以消除臨對象上”,為了能更“簡單”地說明ET,所以寫的例子很簡陋,不過我想大概的做法已經點到了。
完善的做法比較復雜,所以我認為這個庫設計都用的武器,寫應用層邏輯時也許不太會用到?(調試、維護都不容易啊……)
下面有一篇文章,從頭開始一點一點地完善這個ExpXXX,講解得非常細~,每一個改善是為了什么!(不過是日文的,嘿,YESHG,為你準備的!中文英文的應該也有,不過我沒搜到這么細致的,呵呵,不過對《C++templates》里的例子應該也夠看了。)
http://homepage1.nifty.com/herumi/prog/prog81.html#MOTIVATION
PS:
至于那個囧類型,我還沒看到有什么好的做法。因為要讓左右操作數接受不同的表達式(a,a+b,a+b*c等等等等)才可用,所以操作數的“類型”不能固定,ExpPlus<I>+ExpPlus<I>==ExpPlus<I>,感覺行不通。你有什么好做法呢?
re: 與臨時對象的斗爭(上) 唐風 2009-12-03 00:06
@OwnWaterloo
呃,不好意思,我是想說“盜版”,呵呵
回想,DB 確實容易聯想成 DataBase,那這句話就不好理解了……
It's my fault :)
re: 與臨時對象的斗爭(上) 唐風 2009-12-02 23:29
@non
是有聽這么說的。
不過我總覺得:不鼓勵或是要求禁用 STL 的組織,肯定得要有牛人實現一套更合適于他們工程的基本類庫,也許他們只是不想要通用的 STL 實現,但 STL 做的那些事,始終還是需要有“人”來做的。
re: 與臨時對象的斗爭(上) 唐風 2009-12-02 23:18
話說 VC6 還真有點像 IE6 ,擁有極高的使用率,但又不能完全支持“標準”,呵呵,不過 VC6 可以原諒,畢竟開發的時候 C++ 標準還沒出臺嘛……
唉,托 D 版的福,我可是每發布一個新版本就立即升級的,呵呵,不過在公司做項目又沒辦法了,得聽公司技術決策者的,呵,而我們公司那個大牛,MS 習慣 VC6 ……。
我也很期待 C++0x 呢,對 C++ 很有感情,哈哈
對于
【沒有右值引用,也可以消除很多臨時變量,只是編程很復雜……】
是啊,但通過這些途徑,完成了一些“目標”之后仍然會覺得心中有缺憾,不能用最優雅的方式解決問題的時候總會不舒服,
就像 Expression Template 被開發出來,我想也是人們想有效率,又想直觀的結果吧……
PS:
您還真是快啊~~我這才發布,你就來了。神仙~
re: 函數調用棧初探 唐風 2009-11-27 19:49
謝謝你的提醒啊~!
呵呵,這兩天跑去看 WinDbg 的擴展命令去了,企圖看能不能通過寫 WinDbg 的擴展來達到目的……有點頭大的說,哈哈。
RednaxelaFX 這個“家伙”也是個神人,我在 JavaEye 上第一次發表這篇文章的時候就有他的回復,相信是同一個人,嘿嘿。(他在 JavaEye 上有關于 JavaScript 運行機制的文章,看得出是很有幾把刷子的)
跑來跑去,發現世界挺大,圈子確挺小,哈哈哈哈 :P
嗯嗯,是夠長的,明天早起好好看,嘿嘿!!
PS:
>>你本來寫的是【quote】吧? cnblogs確實很偏心,cppblog確實是穿小鞋的……
確實是的,唉……
這段時間在通過 CSS 和 JS 腳本在配置 cnblogs 的博客,已經比較滿意了,嘿嘿。
@OwnWaterloo
是的啊,正好我也在“回味”,哈哈,準備作為那篇 SFINAE 隨筆的補充,加一些 enable_if 的筆記……
對于 enable_if 的還有一個比較舒服的功能點是:
boost::disable_if<boost::is_class<T>, DataFromFile&>::type
這個可以放返回值的位置上生效,并且讓條件滿足時使用DataFromFile&作為返回類型,其它情況下讓它 Substitution fail,而不對程序產生“負面影響”。
真是非常體貼啊,因為在這個地方,運算符重載的參數個數是有限制的,不能隨意增加,所以在這里不能直接在參數表中加 T::* p = 0 之類的東西來運用 SFINAE。
re: 函數調用棧初探 唐風 2009-11-22 12:54
>>問題就在于這個前提是沒有保證的。編譯器處理尾調用時可以使用jmp而不用call。這種情況在msvc和gcc上都存在。
哦哦,原來還有這種情況,呃,如果是在 debug 模式下,優化全關呢?嗯,找個時間我再也看看。
>>或者其他profile工具是怎么做的?
這倒是,以前沒想到這個可以做參考呢,嗯,謝謝提醒。
真是獨學而無友,則孤陋而寡聞。
PS:
一連兩天看到你搶占沙發長篇回復,果然是神人啊……
什么時候我夠格能和你“論戰”一番而后雙方受益,倒是可以“含笑九泉”了,:)
學習中……
re: 函數調用棧初探 唐風 2009-11-21 17:39
@OwnWaterloo
調試器沒有符號表的情況下應該也能工作,但給出來的信息是“人類不可讀”的。
一直在找一種方法,希望能實現這樣的需求:
給出兩個斷點,當程序停在第二個斷點的時候,希望得到在之期間被調用過的函數的列表(按時間順序)。
當然,希望這個方法是非侵入性的。
棧信息顯然是不夠的,某一時刻的棧信息只有被斷點函數的上層函數信息,但可以肯定的是每個函數調用都會有壓棧出棧,能不能設置一個類似“勾子”的東西,在CPU進行壓棧的時候記錄下某些信息呢?
@OwnWaterloo
謝謝推薦,說起來,C++ 的書讀了不少,不過 BS 老爺子的《the c++ programming language》還真是沒看過……慚愧,回頭找來啃一啃。
《標準C++輸入輸出流與本地化》這本書看了前兩章都看不下去了,實在有點無趣,倒是《C++ standard library》中IO部分看幾回,但本地化還是沒搞明白。
PS:
說到 log 模塊,覺得還是蠻有用的,就現在手頭上做的項目來說,如果沒有這東西,所有模塊的 log 信息不受任何控制的話,光是這些 log 的通信就能把機器卡死(因為機器與PC的是串口連的)……
覺得對于大一點的軟件(雖然我只接觸了一個)來說,系統自身的調試機能和控制都蠻重要。