作者cplusplus (永夜)
看板C_Sharp
标题Re: [问题] 大小为零的array
时间Fri Aug 19 19:24:41 2005
※ 引述《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
1F:推 AuronC:谢谢您~~学到了很多 :) 220.138.67.168 08/20
※ 编辑: cplusplus 来自: 140.115.217.14 (08/22 20:48)