re: 靜態庫中全局變量的初始化問題 李現民 2011-11-07 10:35
@Kevin Lynx
這個問題后來我試過,在我的項目里( 前面提到的,使用了VC6),問題出在使用singleton生成單個factory對象的地方。如果將factory的構造函數設計為private,同時提供一個類get_instance()的public static方法,會產生多個factory實例。具體表現就是,register()函數的確執行了, 但是所有的注冊內容都注冊到了第一個factory對象身上,等到運行期使用create方法的時候,使用的卻是后面新生成的factory對象,因此會發生沒有注冊過的假象。
解決方法為:將factory()構造函數聲明為public,在factory類外面定義一個singleton函數,并一直使用這個函數進行注冊與創建。但這種方法的缺點是你無法從語法上確保所有用戶使用的都是這個singleton對象。
懷疑為VC6的bug,不過由于已經基本滿足了需要,未繼續深究。
你可以用&sname[0], 如果覺得不安全可以用strdup(sname.c_str()), 會返回一個copy
@oldman
對, 無法區分跨多行的/**/注釋的后面部分
@simon
不,其實這個不容易看出來, 是因為網頁的名字叫peak.html,peak與pickle諧音,很扯的理由, 哈哈
兄弟你是完美的吧? 這個框架我在內部bbs上見過, 但rtx上怎么沒有你的名字呢?
@simon
你去看一個網頁的源代碼,里面有一個鏈接, 你點一下會出現 and the next nothing is 92512, 替換Url里linkedlist.php?nothing=12345中的12345,然后再回車, 你就會發現規律了
@oldman
&str[0]的數據是可以修改的, 而str.data()的數據不能修改
re: 最近筆試面試集錦(c/c++) 李現民 2011-05-06 12:24
判斷是否為奇偶數可以用(a&1), 取最后一位,是0則為偶數,是1則是奇數
re: 一道C++面試題的誤區 李現民 2011-05-06 12:19
自己試了一把, 還真是這樣, 真悲劇啊
switch語句被匯編翻譯的結果與case的長度及數值規律有密切關系,并不是簡單的翻譯成跳轉表, 同時與編譯器的優化能力也有關。
你可以看一下這篇文章:
http://www.shnenglu.com/besterChen/archive/2009/12/07/102682.html
re: 游戲客戶端與編輯器代碼重用設計雜談 李現民 2010-12-13 15:53
@right
:) 跟vc6不能說關系大, 也不能說沒有關系。但就本篇所表達的思想講,您可以認為是獨立于vc6的
寶貴意見,非常感謝!
re: 編程習慣(2) 李現民 2010-12-07 21:10
代碼是簡潔了, 但閱讀起來更費神了。為什么要寫成這樣呢? 生成的匯編代碼應該是一樣的
re: C++多態技術[轉貼] 李現民 2010-12-07 10:49
文章很好, 我也保留一份, 嘿嘿
re: bash 常用東東 李現民 2010-12-04 17:30
留名,學習
re: 冒泡和選擇排序該被踢出教材了(轉) 李現民 2010-11-28 09:35
@oldman
對您提出的意見表示感謝
但是, 這文章是轉csdn上的一篇帖子,帖子的地址您可以在文章的最開始處看到,基于尊重原創的想法,我覺得還是不要去修改的好。
再次表示感謝!
re: const靈異現象 李現民 2010-11-25 09:25
@fool
支持你一下, 哈哈
觀察者模式應用起來的確有些復雜,也許你可以考慮仿寫一個c#的delegate,這樣的話可以支持多播, 而且編程實現上要簡單不少。
re: c++編程習慣(1) 李現民 2010-11-23 22:11
A arr[10]={0}; 的生成匯編中就調用了memeset,但前者比后者還多了一個賦值,因此還要稍慢一點 :D
re: const靈異現象 李現民 2010-11-23 18:20
@classyk
我的理解:volatile const其實是變量可以不可預期的被程序以外的環境所改變,而對于相同的一段程序內部而言,這樣聲明并不能使你有更好的方式可以修改此變量的值
re: const靈異現象 李現民 2010-11-23 18:16
@vincent
在默認情況下,其實不是這樣的。
const 修飾內置數據類型時,比如const int a= 10; 則a是一個編譯期常量,因此你可以進一步定義int b[a]= {0}; 在編譯意味著它沒有內存地址(這是一個運行期的概念),因此并不存在放置于只讀數據段的現象。
只所以說是“默認情況”,是因此在更復雜的情況下const常量對象是需要分配內存的,比如說文章中出現的取其地址的時候,再比如定義更加復雜的集合對象的時候。
re: const靈異現象 李現民 2010-11-22 19:37
@冬瓜
可不僅僅是這樣的,對于修飾為const的變量,編譯器可能會去做一些處理,表現在有無const,最終生成的匯編代碼很可能是不同的
re: const靈異現象 李現民 2010-11-22 15:40
@airtrack
受教了, 呵呵, 第一次聽說這個詞, 謝謝
@陳梓瀚(vczh)
這是為什么? 好像stlport中std::string的operator= 就是用memcpy實現的吧
fastdelegate, 前兩天還真看見公司的一個項目上用到它了, 看實現應該很快,不過可惜的是不支持多播
re: C++通用刪除器設計 李現民 2010-11-17 19:42
@星綻紫輝
呵呵, 受教了
re: C++通用刪除器設計 李現民 2010-11-17 17:58
@冬瓜
是這樣的, 大家覺得如果直接用shared_ptr的話就沒有必要寫一個delete_null函數了
re: C++通用刪除器設計 李現民 2010-11-17 10:40
@Jeff
沒有, 非常歡迎你的評論。大家的回復讓我想了很多,這些都是非常意外而重要的收獲。
其實, 最直接的問題是:我沒有權利在項目中引入一個像boost 這樣大的庫,因此這不但限制了應用,也限制了我的眼界。
re: C++通用刪除器設計 李現民 2010-11-17 10:36
@陳梓瀚(vczh)
看了這么多回復, 如果我沒想錯的話,是不是大家都推崇使用shared_ptr替代原始對象指針?如果多數人都這認為的話,那肯定是有道理的。如你所言,看來有時間我得去仔細研究一下shared_ptr了。
我現在能想到的問題是,假如我自己寫了一個shared_ptr加入到了舊的項目中,那么所有其它使用該對象的地方(包括參數)是否都必須帶著shared_ptr<T>的聲明呢?
感謝回復,不忙的時候研究一下。
re: C++通用刪除器設計 李現民 2010-11-16 11:16
@空明流轉
我所指的“不穩定”是指boost一直在開發,里面有長期積累下來的庫,也有新加入的庫,只是加入到項目中,新庫在未證明其穩定性之前也有可能被使用,而這可能導致一些問題。
另外, 你說得對,相比于資源的分配與回收,shared_ptr的開銷是可以忽略的,但我們的系統中現在還沒有這樣的機制,而且我說過了,真正的原因是我尚未發現讓我不得不用它的理由。
最后, 我其實是很贊同使用RAII的,實際上,我們已經在陸續使用它了。
感謝回復!
re: C++通用刪除器設計 李現民 2010-11-16 09:18
@Jeff
唉, 這批評還真犀利呀!
1. 不直接使用boost中的智能指針最直接的原因是boost不穩定,而且并不是boost中的所有特性都對項目有幫助的。你可能會問為什么我不自己實現一個,一個類似于shared_ptr的東西,除了那一點性能損失外,真正的原因是我還沒有發現讓我不得不用的理由。而且,項目中有很多地方是不能直接調用析構函數的,而是需要單獨寫一個Destroy的函數,因為時機。
2. 關于異常安全,我想,如果析構函數本身是異常安全的話,那么我的代碼本身應該算異常安全了吧?反之,如果析構函數本身不安全的話,那無論采用什么方法析構都是有問題的。
如果我的想法有什么問題的話,請不吝指正,非常感謝。
re: Vim操作技巧札記(一) 李現民 2010-11-08 09:33
直接輸入行號按下G就可以跳轉到指定行
re: Switch結構學習筆記 李現民 2010-11-03 10:56
好文章, 非常細致
re: 素數查找 李現民 2010-09-29 10:14
memset是一種高效的數組初始化方式,它本身是用匯編寫的,vc下應該是位于memset.asm中,當你使用部分初始化時, 比如int a[100]={0}, 你會看到它的匯編代碼其實用的就是memset。
把sqrt(N)拿到外面那個, 你不覺得你的代碼中每次循環sqrt(N)都會調用一遍嘛?當然, 現代編譯器的話,這種簡單的調用可以被優化掉,但作為碼農, 你不應該寫成這樣
re: 素數查找 李現民 2010-09-28 19:04
不要使用using namespace std; 因為std命名空間里的東西全是一些常見的名字, 像string, vector, list等等,直接使用std::string,以防止重名
#define N 100可以使用const常量代替(并且,盡量放到一個空的namespace下),否則你需要定義成#define N (100),加括號,這是常識
prim[i]=true;的那個循環可以改成memset(&prim, 1, sizeof prim)
for(i=2;i<=sqrt(N);i++)---請把sqrt(N)拿到循環外面來
看你寫代碼的樣子,應該是vc6吧,把int i,j;放后面點吧,不過在在未使用的地方就定義變量,比如int j完全可以放到循環內部定義
re: 接口,虛函數及純虛函數 李現民 2010-09-28 18:44
分得太細反而著了相, 不要太看重語法上的區別,這些東西都是基于應用而衍生的,多研究一些設計的東西, 比仔細區分這些語法概念要合算
re: 這是個很狡猾的bug。 李現民 2010-03-09 10:09
-__-看不出來
re: 靜態庫中全局變量的初始化問題 李現民 2010-02-10 12:14
@金慶
不好使
我想應該是這個問題:
Only problem is that the symbol is not very...simple. I have a class called fxAttributeEditor, but you can't just do /include:fxAttributeEditor. The symbol is actually:
??_C@_0BC@OFGGEBAJ@fxAttributeEditor?$AA@
And that does work, but having to add that seems like a terrible coding decision. It seems like going the dynamic library route would be far better. I've had a variety of really good reasons for not wanting to do that. I'm not against DLLs, but in some cases (like mine) I don't believe it's the best choice. Is there not any better way to go about this?
Thanks,
這是引用原文, 大概意思是“不能夠在#pragma comment(linker, /include:)中直接使用你定義的那個變量名”,因為c++編譯時會將其改為??_C@_0BC@OFGGEBAJ@fxAttributeEditor?$AA@這樣的的形式。
我不知道是不是真的這樣, 但我的實驗結果是找不到我自己定義的變量名
re: 靜態庫中全局變量的初始化問題 李現民 2010-01-20 19:44
我以前也試過這樣的方法, 項目用的是vc6,只debug版本下對象是可以生生的,release版本中就被人優化掉了,沒有找到保持這種級別低耦合度的替代方案。
到現在為止, 我寫的那個factory類再也沒有用過,因為看不到優勢在哪里, 還不如現寫一個工廠來得清晰
@xu
提供功能性接口,去完成有意義的操作,盡可能的不要暴露數據成員
re: IM在線查看器 軟件下載 李現民 2009-11-16 10:06
厲害, 這都行
re: 微軟的面試題 李現民 2009-09-21 09:28
這種題只能拿來隨便練練, 每個面試官都會出自己的題
re: VC6中的簡易delegate實現 李現民 2009-09-07 09:20
@free2000fly
這個是單播的、面向編譯器的
re: VC6中的簡易delegate實現 李現民 2009-09-02 17:39
@foxriver
呀,意外之喜,同樣謝謝你,哈哈
re: VC6中的簡易delegate實現 李現民 2009-09-01 21:07
@OwnWaterloo
不過你說的那三種語法中的第三種,VC6肯定支持,呵呵,現在正在向第二種努力
re: VC6中的簡易delegate實現 李現民 2009-09-01 21:05
@OwnWaterloo
恐怕暫時不會去試boost了,其實我到想,但公司明確禁止在項目中使用boost。我曾經試過,被上司否定了
re: VC6中的簡易delegate實現 李現民 2009-09-01 21:03
@陳梓瀚(vczh)
我也不想用啊,但我只是個兵啊,這不是沒有辦法么,呵呵