模板化和非模板化可变参数函数之间的编译差异,当参数仅进一步传递(不单独访问)时 [重复]

Compilation differences between templated and non-templated variadic functions when arguments are only further passed (not accessed individually) [duplicate]

提问人:Louis15 提问时间:10/20/2023 最后编辑:user17732522Louis15 更新时间:10/20/2023 访问量:71

问:

我试图了解在 C++ 中具有模板化和非模板化可变参数函数之间的编译(特别是在编译时间)方面有什么区别,在特殊情况下,传递的可变参数只需要进一步传递给另一个函数 - 而不是单独访问。

例如,假设我们有这个测试用例类:

class ClassA 
{
    int _x = 0;
    double _y= 0.0;
    const char* _z = "";

    public:
    ClassA(int x, double y, const char* z) { _x=x; _y=y; _z=z;}

    void get() { printf("%i %f %s\n", _x, _y, _z); }
};

接下来,我们有一个函数的非模板化版本和一个模板化版本:

void fooVar(const auto & ...args)
{
    ClassA instance = ClassA(args...);
    instance.get();
}

template <typename... Args>
void fooTemp(const Args & ...args)
{
    ClassA instance = ClassA(args...);
    instance.get();
}

两者都按预期工作:

int main
{
    fooVar(10, 3.5, "example");
    fooTemp(10, 3.5, "example");
    return 0;
}

我试图了解编译器对待每个函数的不同之处,以及当一个函数具有许多可能更复杂的函数时,编译时性能的优缺点是什么 - 当传递的可变参数没有被扩展为单独访问时,而只是进一步传递给一些其他函数。

C++ 性能 编译 C++20 variadic-templates

评论

1赞 tkausl 10/20/2023
这两个函数都是模板。
0赞 Louis15 10/20/2023
@tkausl它们是相同的,即第一个只是第二个的缩写可变参数函数模板?
0赞 user12002570 10/20/2023
请参阅函数模板和缩写函数模板之间的等效性

答:

1赞 user17732522 10/20/2023 #1
void fooVar(const auto & ...args)

在函数参数列表中使用占位符会使函数成为缩写的函数模板,这使其等效于函数模板,该函数模板对每次出现的 .即在这种情况下,它完全等价于autoauto

template <typename... Args>
void fooVar(const Args & ...args)

两者都是带有模板参数包和函数参数包的可变参数模板变参数函数也不是完全不同的东西。可变参数函数是一个 C 概念,与模板无关。例如,是可变参数函数。它们通常只在 C++ 中用于与 C 接口。printf