模板之小试牛刀---我有点明白为什么这么多人骂c++了
来源:互联网 发布:mysql的存储引擎 编辑:程序博客网 时间:2024/05/07 02:18
有朋友让我写一个模版算素数的程序,我也好久没用模版了,就当是热手。结果让我非常非常郁闷。
另外附带写了算整数平方根,因为素数判断时要用。下面有4个测试宏,分别是打印素数,打印素数个数,打印是否是素数,打印整数平方根。
很意外的发现,编译时运算居然不支持逻辑运算短路。也就是说编译时运算结果已经在常数表达式左边算出,逻辑运算依然要强行算完剩下的。
以prime_check(检查是否是素数)为例,
prime = D == 1 ?
true : N % D == 0 ?
false : prime_check<N , D - 1>::prime
当D=1时,prime的结果就可以获得。然而编译器会不必要的强行把整个表达式算完。于是如果没有对D=1作偏特化,编译器便会无限制的进行递归展开,直到展开过深报错。我不得不添加了一个其实根本没用的偏特化prime_check<N , 1>,并放弃使用vc6改用其他支持偏特化的编译器。我一时身边能找到的g++, intel, codepad.org等编译器都是完全相同的行为。
事实上我并不知道编译器是真的去计算prime_check<N , D - 1>::prime呢,还是仅仅把prime_check<N , D - 1>实例化。总之在逻辑运算之外产生了完全没有必要的副作用。我先后试了&&,||,?:,都是完全相同的结果。
最让人不可接受的是:预处理的#if逻辑运算支持短路,运行时的&&,||,?:逻辑运算支持短路,但是在这2个阶段中间的编译阶段却不支持(这算是c++自己搞出来的)。你说凭什么让程序员不骂制定c++标准的人白痴?
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了(终,算法改变世界)
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了(爱恨也交加的c++,让我不得不继续说下去)
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了(补,补充一些骂点)
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了(续,c++图灵完备最小集)
- 我稍微有点明白了
- 我现在明白为什么和尚十两命了
- 让你明白为什么中国这么多外汇,却不敢自己花,,,,,很长,仔细看就明白了
- 2010年11月24日 我好像有点明白什么是语义网了
- 宝贝有点明白妈妈的意思了
- 读写文本文件,终于有点明白了
- 我明白了做人
- 我积累了这么多文章了?
- 为什么这么多人"黑"阿里?
- 为什么觉得有点累了?
- IE有这么多问题,为什么用的人这么多
- 看了这篇就会明白为什么我们只能当平常人
- 算法篇之完整的大数!!!(我能想到的高精度就这么多了)
- SQL 语句性能调优
- Address Windowing Extensions
- 把C++/CLI委托传入本地代码
- oracle学习笔记(四)关于shutdown、startup几个参数
- 安装SQL2008问题
- 模板之小试牛刀---我有点明白为什么这么多人骂c++了
- java static关键字
- MySQL5中文乱码解决
- kmp算法之nextval(转载 )
- 服务器安全配置
- Gcc中使用profile工具优化代码
- symbian 检查系统版本 完整(=_=)
- 求1到(10^N - 1)中9的个数
- P2P之UDP穿透NAT的原理与实现(附源代码)