什么东西可以做c++模板实参?

来源:互联网 发布:千叶软件 编辑:程序博客网 时间:2024/04/28 23:10

今天有人问起这个问题,我突然愣了一下。

 

有些东西,别人不问,自己未必会去深入的思考其来龙去脉,虽然已掌握其大略。所以, 别人的问题, 对自己也是一个提高的机会.

 

仅仅简单的把c++标准文档的那些东西重述一遍, 别人显然是记不住地.

 

略一沉思,说出了我自己的答案:

 

"取决于传入的实参, 在链接时或编译时, 能够执行是否'等价'的判断操作, 从而使得链接器和编译器能够清除掉重复实例化的模板,仅仅只保留一份实例化生成的代码."

 

有什么东西能够在链接时进行是否'等价'的判断操作呢?

 

1)类型,相同的类型自然"等价".

 

2)常数,相等的常数自然"等价". 可惜c++上一个03标准禁止了浮点常数作模板实参, c++0x标准对"编译时浮点数运算精度"的讨论还如火如荼,我都看了好几个提案了,估计这次讨论的结果依然会是无果而终,禁止使用.

 

3)可被其他编译单元引用的任何symbol的地址. 这里所指的symbol包括全局变量, 任何全局名字空间域的全局函数, 类名字空间域中的成员函数. 在不同的编译模块中对同一个symbol取的地址, 在链接时, 链接器一定会让他们相等,因而他们本质上成了常数(链接器才知道这个常数的值,编译器仅仅知道它将会成为一个常数).链接器知道这个常数的值后,自然就可以判断是否相等了.

 

注意: static全局变量和static 全局函数,链接器完全无法访问.而编译器在链接之前自然无法知道static全局变量或函数的地址, 所以这个地址将是一个变量, 从而不能和其他指针进行是否'等价'的判断操作(需要推迟到运行时). 其实非static全局变量或函数的地址对编译器来说也是变量, 但是编译器知道链接器会把他们变成常量,因此编译器就把他们暂时放行,等待秋后处置. 

 

这其实也告诉我们为什么函数指针常常让编译器放弃inline优化: 因为编译器对函数取地址的结果是一个变量, 也就是说取地址的行为要在链接时才能真正的执行出常量结果!! 此时再去做inline优化显然太迟,太晚了.

 

以上见解完全没有阅读任何c++标准文档, 纯粹是作者对一些c++知识的理解达到一定程度后,作出的合理思考后推理出的结果. 但是结论本身是符合c++标准的. 就当笔者在胡乱的揣测c++标准是怎么来的吧, 呵呵

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脚扭伤了怎么办的反思 中班安全迷了眼怎么办 15个月的小孩长泡疹怎么办 墨盒加错颜色墨水怎么办 墨盒颜色加错了怎么办 uV打印有色差是怎么办 cmyk和rgb有色差怎么办 染头发新长出来怎么办 白色衣服弄上口红怎么办 口红弄到牛仔裤上怎么办 口红弄到沙发上怎么办 做了拔罐后背疼怎么办 拔罐拔出血水后怎么办 拨了罐浑身疼怎么办 拔完火罐洗澡疼怎么办 拔罐之后脊背疼怎么办? 五个月的狗胆小怎么办 电脑颜色不正常分辨率调不了怎么办 宝宝认人怎么办 五个月 新生儿42天听力筛查未通过怎么办 幼儿大便干燥拉不下粑粑怎么办 宝宝大便干燥拉粑粑带浓血怎么办 新生儿便秘4天了怎么办 写卷子的题目不认识怎么办? 2个月小猫尿床怎么办 安全教案鱼刺卡住了怎么办 被鱼刺卡住怎么办安全教案 小班健康教案生病了怎么办 被蜜蜂蛰了怎么办教案 走丢了怎么办大班反思 小孩吃了硬物怎么办 小孩吞了硬物怎么办 小学二年级孩子成绩不好怎么办 二年级孩子成绩不好怎么办 一年级学的不好二年级怎么办 17个月宝宝夜奶怎么办 小孩吃积食了吐怎么办 11个宝宝不会爬怎么办 5岁宝宝严重挑食怎么办 孩子吃菜口味重怎么办? 孩子挑食不吃菜不吃肉怎么办