大佬教程收集整理的这篇文章主要介绍了c – G为未使用的模板特化生成代码?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template <int size> void special_function() { std::cout << "Called without specialization: " << size << std::endl; } template <> void special_function<4>() { std::cout << "dword" << std::endl; } template <> void special_function<8>() { std::cout << "qword" << std::endl; } int main() { special_function<sizeof(int)>(); return 0; }
在我的32位系统上,按预期执行上述程序输出dword.但这样做的全部意义并不是只做if(sizeof(int)== 4){…}如果……是我希望编译器只为适当的函数生成代码.由于special_function< 4>是这个程序中唯一调用的,我希望它是编译器生成的唯一一个(在本例中是gcc 4.1.2,在x86 Linux上).
但这不是观察到的行为.
虽然它确实有效,但每个模板专业化的代码都会生成,尽管从未使用过.但是,不生成通用定义.
我应该提一下,这是一步编译,而不是编译到中间对象文件后跟一个链接.在这种情况下,将死代码删除推迟到链接阶段似乎很自然,我知道链接器并不总是非常擅长这一点.
有谁知道发生了什么?我在这里缺少模板专业化的微妙之处吗?上帝知道魔鬼与C有关.
编辑:因为它已被提及,这种行为发生在-O3和-Os.
EDIT2:Rob建议将函数放在匿名命名空间中.这样做并使用任何级别的优化进行编译确实会删除死代码,这很好.但我很好奇,所以我尝试用以下程序做同样的事情:
namespace { void foo() { std::cout << "Foo!" << std::endl; } void bar() { std::cout << "Bar!" << std::endl; } } int main() { foo(); return 0; }
这里的想法是看看Rob的解决方案是否实际上与模板特化相关.事实证明,上面编译时启用了优化的代码省略了可执行文件中未使用的bar()定义.所以看来,虽然他的答案解决了我的直接问题,但它并没有解释为什么根本没有编译未使用的模板特化.
以上是大佬教程为你收集整理的c – G为未使用的模板特化生成代码?全部内容,希望文章能够帮你解决c – G为未使用的模板特化生成代码?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。