预处理可以将所有错误判断等等放到编译期,从而不影响运行速度,也方便改bug。
标准库当然肯定也是这么干的,我只是翻到了确实然后没有细看,array的实现:
意思是说, debug模式下会进入_STL_VERIFY() 的宏里面(里面其实是会消耗性能的代码),而release模式下则不检测越界所以没有任何性能消耗。嘛,学会了,我也要这么干。release下的array与c原始数组的性能是一样的,内存占用也是一样的,.size()是个常量表达式也没有性能消耗,就某些api有性能消耗,不过用原始c数组实现也多少有消耗的。但还是喜欢用原始c数组.jpg
【总】#预处理完全不能与模板参数合用!
因为预处理发生在编译时,模板的实际生成是在运行时,这我当然知道,但写起来就忘了而且VS并不会报错。如,编译器将会判断'N'字符的编码集对应的数与0作对比,于是没有报错,只能说相当灵活qwq。
标准库看起来那么臃肿,很多都是因为不能这么干,用其他方法规避产生的,如防止你输入的数组数是负数或0:size_t本质上是unsigned long long,避免了负数,然后又定义了几百行的class array<T,0>,在你输入array<int,0>的时候会重载决议到这里,对这么大几百行就为了应付你输入0,但对0个元素的数组也单独提供了所有的api支持,太尽心尽力了qwq
标准模板库为什么叫std::(study::缩写),这是在教你做事!多读多学好诶!