C++之零长度数组

222 阅读1分钟

今天阅读代码的时候发现了一个神秘的写法, 一个长度为0的数组,趁着机会总结一下。

![](https://upload-images.jianshu.io/upload_images/23475747-8f80541e7351cace.png?imageMogr2/auto-orient/strip|imageView2/2/w/859/format/webp)

首先,值得注意的是这个技巧只在GUN C的环境下可以使用。其他环境下是不可以的。

零长度数组是不占用空间的。我们来做几个实验。

![](https://upload-images.jianshu.io/upload_images/23475747-e9e96318a8ceffb7.png?imageMogr2/auto-orient/strip|imageView2/2/w/642/format/webp)
![](https://upload-images.jianshu.io/upload_images/23475747-844a085552dce794.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
![](https://upload-images.jianshu.io/upload_images/23475747-a58b5f350659178c.png?imageMogr2/auto-orient/strip|imageView2/2/w/655/format/webp)

可以看出来在第一个和第二个struct中,即使第二个struct多了一个零长度数组,struct的大小并没有发生变化。但是如果这个数组长度为1则增加了一个int的4字节长度。至于包含指针的struct,由于是64位操作系统,64位的地址为8字节,struct发生了字节对齐使得原本应该为4 + 8的变成了8 + 8的大小。 对于编译器来说, 此时长度为0的数组并不占用空间, 因为数组名本身不占空间, 它只是一个偏移量, 数组名这个符号本身代表了一个不可修改的地址常量。

0长度数组优势:

1.内存分配是连续的,有利于提高性能。如果是使用指针的方式,指针指向的内存地址空间与struct所在的位置是不同的需要二次访问才可以。

2.使用更加简便。在使用指针方式的时候当我们释放struct这片内存的时候还需要自己去释放struct内部指针指向的空间。使用0长度数组则不需要这个操作。