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

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值