通用Lambda和二进制大小/代码膨胀

时间:2018-09-12 23:15:15

标签: c++ c++11 templates lambda

当我们比较以下代码时,生成的二进制文件有什么区别:

struct S {
    template<typename... Args>
    void operator()(Args... args) { /* ... */ }
};

// And then inside some block:
S s;
s(42);
s(3.14, "Hi!");
s("Hi!", 3.14);

...此代码:

const auto l = [](auto... args) { /* ... */ };

// And then inside some block:
l(42);
l(3.14, "Hi!");
l("Hi!", 3.14);

据我了解,struct代码为operator()创建了3个模板实例化,所有这些模板化实例均以符号形式显示在二进制文件中。那lambda呢?编译器创建类似于s的对象。但是,如果它是未命名的类类型,是否会在二进制文件中创建符号?

动机:我使用了模板繁重的库,因此必须启用/bigobj。我想避免这种情况,我想知道lambda是否可以帮助防止模板代码膨胀。这是在标准中定义还是取决于编译器的实现?

1 个答案:

答案 0 :(得分:1)

不幸的是,我认为lambda不能帮助您解决代码膨胀问题。对于您的示例,如struct S,编译器还将为lambda创建三个不同的运算符()。

为了证明我的观点,我在Linux上使用g ++ 8.1.0编译了以下程序。

int main()
{
    const auto l = [](auto... args) { /* ... */ };
    l(42);
    l(3.14, "Hi!");
    l("Hi!", 3.14);
}

,然后使用 nm 命令查看二进制文件,结果如下:

output of nm command

不难看出最后三行是三个运算符()的符号。因此,在这种情况下,lambda和struct S从根本上没有什么不同。