Re: [問題] 大小為零的array
※ 引述《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)
討論串 (同標題文章)
C_Sharp 近期熱門文章
PTT數位生活區 即時熱門文章