今天阅读代码的时候发现了一个神秘的写法, 一个长度为0的数组,趁着机会总结一下。
首先,值得注意的是这个技巧只在GUN C的环境下可以使用。其他环境下是不可以的。
零长度数组是不占用空间的。我们来做几个实验。
可以看出来在第一个和第二个struct中,即使第二个struct多了一个零长度数组,struct的大小并没有发生变化。但是如果这个数组长度为1则增加了一个int的4字节长度。至于包含指针的struct,由于是64位操作系统,64位的地址为8字节,struct发生了字节对齐使得原本应该为4 + 8的变成了8 + 8的大小。 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量。
0长度数组优势:
1.内存分配是连续的,有利于提高性能。如果是使用指针的方式,指针指向的内存地址空间与struct所在的位置是不同的需要二次访问才可以。
2.使用更加简便。在使用指针方式的时候当我们释放struct这片内存的时候还需要自己去释放struct内部指针指向的空间。使用0长度数组则不需要这个操作。