Re: [問題] 大小為零的array

看板C_Sharp (C#)作者 (永夜)時間20年前 (2005/08/19 18:53), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串4/4 (看更多)
※ 引述《AuronC (阿隆西)》之銘言: : Sorry..有點跟C#無關... : 看MicroSoft的code常看到,如 : struct : { : //... : int p[0]; : }; : 請問一下,宣告一個大小為零的用意為何?謝謝。 如果沒猜錯,基本上這應該是C裡面的CODE吧,這是C的一種trick 因為C可以自由動態配置記憶體 所以當你要配置一塊記憶體當作你的 struct 用時,你可以這麼做 struct A { //...... int length; char p[0]; }; A *a=(A*)malloc(sizeof(A)+len); 這時候整個配置的記憶體區塊就比 struct A 所需大上 len bytes 這些多出來的空間就可以放資料,剛好是接在整個struct的最後面,跟 p 剛好接起來 所以從 p 的位址算起來實際上就有 len bytes 可以用,可以放長度為len的資料 像是長度len的字串(last 1 byte for '\0') char *ID="???????...."; int len=strlen(ID)+1; A *a=(A*)malloc(sizeof(A)+len); strcpy(a->p,ID); a->length=len; ........... free(a); 當然看你要用什麼樣型態的資料,用int[0]也可以 如果不用這個trick,一般的做法是 struct A { int length; char *p; }; A *a=(A*)malloc(sizeof(A)); // 配置一次 要額外成本 a->p=malloc(len); // 配置二次 也要 strcpy(a->p,ID); ...... free(p); // free 1 time free(a); // free 2 time 在C裡面會用這個 trick 是為了效率考量 空間效率與時間效率 用這個 trick 對動態記憶體的追蹤管理空間,只要一個,不是兩個(節省空間 1) 另外 int *p 是一個指標的大小,而 int p[0] 不佔空間,p 只是表示一個"位址" (節省空間 2) 也不用釋放兩次(節省時間 1),存取速度也會變快(相較於指標,why,可 以想想看)(節省時間 2),也不太會造成記憶體破破碎碎 在以前的時代,對C的要求就是效率,所以在各方面都會極力榨取,這trick就是個好例子 不過這個trick只適合在C裡面使用,不適合在C++裡面使用。因為C++為了支援OO, class跟struct都會動過一些手腳,都不像C裡面的struct那般單純,不單單只是資料區塊 有蠻多考量的因素,所以不能在C++裡面使用了~~ ----- 以上 不過好像不太符合C#版的東西 @@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.217.14

220.138.67.168 08/20, , 1F
謝謝您~~學到了很多 :)
220.138.67.168 08/20, 1F
※ 編輯: cplusplus 來自: 140.115.217.14 (08/22 20:48)
文章代碼(AID): #131RevBQ (C_Sharp)
討論串 (同標題文章)
文章代碼(AID): #131RevBQ (C_Sharp)