递归可变参数模板函数代码膨胀

时间:2015-04-27 05:30:49

标签: c++ templates c++11 recursion variadic-templates

我查看了gcc中的转储文件,看看编译器如何处理递归可变参数模板函数。

使用此测试代码,

#include <cstdio>
#include <cstdarg>

using namespace std;

int sum(int n, ...)
{
    va_list arguments;
    va_start(arguments, n);
    int sum = 0;
    int argument = n;
    while (argument != 0)
    {
        sum += argument;
        argument = va_arg(arguments, int);
    }
    return sum;
}

int sum2(int n)
{
    return n;
}

template<typename... Arguments>
int sum2(int n, Arguments... arguments)
{
    return n + sum2(arguments...);
}

int main()
{
    printf("%i %i\n", sum(1, 2, 3, 4, 0), sum2(1, 2, 3, 4));
}

编译,

gcc test.cpp -std=c++11 -fdump-rtl-all

转储,

;; Function int sum(int, ...) (_Z3sumiz, funcdef_no=0, decl_uid=2538, cgraph_uid=0)
;; Function int sum2(int) (_Z4sum2i, funcdef_no=1, decl_uid=2547, cgraph_uid=1)
;; Function int sum2(int, Arguments ...) [with Arguments = {int, int, int}] (_Z4sum2IIiiiEEiiDpT_, funcdef_no=4, decl_uid=2557, cgraph_uid=3)
;; Function int sum2(int, Arguments ...) [with Arguments = {int, int}] (_Z4sum2IIiiEEiiDpT_, funcdef_no=5, decl_uid=2564, cgraph_uid=5)
;; Function int sum2(int, Arguments ...) [with Arguments = {int}] (_Z4sum2IIiEEiiDpT_, funcdef_no=6, decl_uid=2574, cgraph_uid=7)

因此编译器在递归调用期间为每个参数数生成了3个单独的函数。

嗯,通过完全优化,像这样的原始情况甚至在没有函数调用的情况下得到优化,但是即使在复杂的情况下,我仍然可以依赖编译器来进行这样的优化吗?或者当事情变得更复杂时,递归模板函数仍然容易受到代码膨胀的影响吗?

0 个答案:

没有答案