- 主题:零长数组太爽了,用得上头,这个好不好?
好多向量长度基本无法再编译器确定,就搞了个零长数组做对象成员,然后用成员静态函数返回向量长度,用着很爽,但是vs疯狂给警告。
零长数组到底有什么不好的地方?影响编译器优化吗?
#发自zSMTH@时光音乐会
--
FROM 124.64.16.*
【 在 hyperLee 的大作中提到: 】
: 好多向量长度基本无法再编译器确定,就搞了个零长数组做对象成员,然后用成员静态函数返回向量长度,用着很爽,但是vs疯狂给警告。
: 零长数组到底有什么不好的地方?影响编译器优化吗?
不合标准
https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
: #发自zSMTH@时光音乐会
: ...................
--
FROM 104.133.8.*
成员静态函数返回向量长度 难道就不是compile time了?
【 在 hyperLee 的大作中提到: 】
: 好多向量长度基本无法再编译器确定,就搞了个零长数组做对象成员,然后用成员静态函数返回向量长度,用着很爽,但是vs疯狂给警告。
:
: 零长数组到底有什么不好的地方?影响编译器优化吗?
: ...................
--
FROM 122.224.174.*
应该是runtime确定一个struct后面再pad多少个array elements。
不是compile time,这种不合标准:
ISO 9899:2011 6.7.6.2:
If the expression is a constant expression, it shall have a value greater than zero.
建议不要用这些东西。
C++的类不单纯是一片内存,各种alignment会给你意想不到的bug。
你debug的时间会比你coding时节约的心智负担多。
【 在 ziqin 的大作中提到: 】
: 成员静态函数返回向量长度 难道就不是compile time了?
:
--
FROM 158.140.1.*
我上零长数组主要是处理数据,不含虚指针,也没有构造对象的需求,类似于重新解释指针的功能
【 在 allegro 的大作中提到: 】
:
: 应该是runtime确定一个struct后面再pad多少个array elements。
: 不是compile time,这种不合标准:
:
: ISO 9899:2011 6.7.6.2:
#发自zSMTH@时光音乐会
--
FROM 221.222.21.*
0数组在变长结构中几乎是必须的,不过推荐是C99的标准写法char someFields[]; 而不是非标准的写法char someFields[0]; 或者 char someFields[1];
linux kernel 5.8有过一次相关的更改:
https://www.phoronix.com/news/Linux-5.8-Flexible-Array-Member
https://herbsutter.com/2009/09/02/when-is-a-zero-length-array-okay/
--
修改:z16166 FROM 125.35.123.*
FROM 125.35.123.*
我试了一下,VS2019还是会对C99的写法char someFields[]给出编译警告,只要是在.cpp里出现,而不是在.c里。因为这是C的标准,不是cpp的标准。
要想所有C++ compiler不给编译警告,估计只能用char someFields[1]这种写法了
【 在 cjon 的大作中提到: 】
: 嗯,用过变长数组,零长的还是第一次听说。
--
FROM 125.35.123.*
对,变长数组好象是C独有的。
【 在 z16166 的大作中提到: 】
: 我试了一下,VS2019还是会对C99的写法char someFields[]给出编译警告,只要是在.cpp里出现,而不是在.c里。因为这是C的标准,不是cpp的标准。
: 要想所有C++ compiler不给编译警告,估计只能用char someFields[1]这种写法了
--
FROM 216.240.30.*
opening a can of worms..
【 在 z16166 的大作中提到: 】
: 我试了一下,VS2019还是会对C99的写法char someFields[]给出编译警告,只要是在.cpp里出现,而不是在.c里。因为这是C的标准,不是cpp的标准。
: 要想所有C++ compiler不给编译警告,估计只能用char someFields[1]这种写法了
:
--
FROM 158.140.1.*