加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读