c zero length array 零長度數組

struct userdata
{
    uint32_t len;
    uint8_t data[0];
};

在閱讀一些開源代碼時,比如linux kernel,會發現上面這種用法,這種叫做零長度數組。有什麼作用呢?簡單來說爲了開發便利,順便節省空間。

使用限制

只能放在結構體結尾,也就是一個結構體只能有一個零長度數組。

使用場景

比如我們有一個變長的數據塊,如何保存這部分數據,有兩種方案。

固定長度數組

struct userdata
{
    uint32_t len;
    uint8_t data[128];
};

可以定義一個最大長度的數組,每次把數據放到該數組中。有兩個缺點

  • 數據固定,如果超過最大值,會報錯,需要重新修改代碼編譯。
  • 浪費空間,正常情況都不會存滿,導致內存浪費。

同樣這種方式也有優點

  • 更好的性能。用空間換時間,數據是提前分配好的,避免了申請時的再次分配。

指針形式

struct userdata
{
    uint32_t len;
    uint8_t * data;
};

這樣在使用時現malloc申請空間,再賦值給data,缺點

  • 多了一個指針,增加了空間佔用

優點

  • 靈活,可以放在任何位置,可以有多個

零長度數組

struct line {
  int length;
  char contents[0];
};

struct line *thisline = (struct line *)
  malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

借用官方的示例說明以下,申請了一塊空間,多出來的就是contents的內容。優點

  • contents不佔用空間,struct line的大小就是int length的大小。contents只是一個符號
  • 數組空間不僅是動態的,還是連續的,更好的性能。使用指針,申請的空間與當前結構體不是連續的。

缺點

  • 不夠靈活,只能放在最後

https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章