Daily C/C++ 弹性数组
之前在写CMU15445的lab的时候遇到的,弹性数组指的是结构体中,长度为0的数组
举个例子
struct foo {
int a;
char b[0]; //或者写成 char b[];
}
当我们分配了一块内存给这个结构体的时候,b的长度就会随着我们分配内存大小的改变而改变
比如我们分配了一个128字节的内存给这个结构体,那么前四个字节就会映射到a中,而后面的124个字节就会映射到b中,此时b就是一个长度为124的数组
这样我们就可以通过灵活改变分配给foo的内存来改变b的大小
要注意的是,这样的结构体要分配在堆上,即我们需要通过malloc来调用。
同时我们的弹性数组要是结构体的最后一个成员变量,这样才能把剩下的内存映射到数组上
优点就是我们平常如果想实现类似的功能的时候,我们需要用类似这样的写法
struct foo {
int a;
char *b;
}
这样我们就会浪费掉8字节的空间,因为b这个指针本身也是要消耗空间的
而弹性数组本质上就是对剩下的空间的一个映射,编译级别上看的话,比如我们调用foo.b[10]
,就是当foo的首地址加上前面定长的地址,再加上offset * sizeof(char)
即可
在实现数据库的过程中,我们有定长大小的页,但是每种不同的页有不同的元数据,通过弹性数组我们可以很方便的得到我们需要储存数据的空间,而不需要额外储存相关的信息
归根结底,是对于指针偏移和类型解析的一个应用,C语言不愧是基石
文章评论