More than code

More Than Code
The efficiency of your iteration of reading, practicing and thinking decides your understanding of the world.
  1. 首页
  2. daily
  3. 正文

Daily C/C++ 弹性数组

2021年10月7日 652点热度 0人点赞 0条评论

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语言不愧是基石

标签: c++
最后更新:2021年10月7日

sheep

think again

点赞
< 上一篇
下一篇 >

文章评论

取消回复

COPYRIGHT © 2021 heavensheep.xyz. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS