c – 模板代码膨胀仍然是最新编译器/链接器的问题
发布时间:2020-12-16 06:50:13 所属栏目:百科 来源:网络整理
导读:我读到最新版本的链接器在多个转换单元中清除了重复定义,通过解决与模板有关的代码膨胀问题. 因此,即使我使用编译的包含模型,我使用模板的代码也不会导致代码膨胀. 我的查询是关于模板的使用(元编程),如下所示: template int N int fact () { return factN-
我读到最新版本的链接器在多个转换单元中清除了重复定义,通过解决与模板有关的代码膨胀问题.
因此,即使我使用编译的包含模型,我使用模板的代码也不会导致代码膨胀. 我的查询是关于模板的使用(元编程),如下所示: template <int N> int fact () { return fact<N-1>() * N; } template <> int fact<1> () { return 1; } int main() { cout << fact<10>() << endl; } 上述代码的exe大小约为8K.如果我传递100而不是10,则代码大小增加到19K. 基本上我试图理解使用模板时可能导致代码膨胀的编码模式. 编辑:在Yakk的评论之后,我使用-O3重新编译,现在的大小几乎相同. 我的问题是,使用模板(使用最新的编译器和链接器)时代码膨胀是否不再是一个问题? 解决方法
通过调用非constexpr函数,您的方式就是在运行时计算结果.即使使用更好的优化(可能使用预先计算的结果),代码仍将表现得好像结果是在运行时计算的,并且通常不保证预先计算.
对于像这样的元编程任务,通过仅依赖于在编译时可用的构造和结果来强制编译时计算结果.下面的示例使用带有静态const int数据成员的专用结构,而不是一组嵌套函数调用: #include <iostream> template <int N> struct fact { static const int value = fact<N - 1>::value * N; }; template <> struct fact<0> { static const int value = 1; }; int main() { std::cout << fact<10>::value << std::endl; } 当我在这个版本中将10改为100时,在编译期间,我看到一堆警告,因为100!多次溢出32位int. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |