gpt4 book ai didi

c++ - 通用 lambda 和二进制大小/代码膨胀

转载 作者:行者123 更新时间:2023-11-30 04:56:53 28 4
gpt4 key购买 nike

当我们比较这段代码时,生成的二进制文件有什么不同:

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 是否可以帮助防止模板代码膨胀。这是在标准中定义的,还是取决于编译器实现?

最佳答案

我认为,不幸的是,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 并没有根本区别。

关于c++ - 通用 lambda 和二进制大小/代码膨胀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52304653/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com