gpt4 book ai didi

c++ - 模板函数中的无捕获 lambda 是否有多个二进制实现?

转载 作者:可可西里 更新时间:2023-11-01 18:37:30 24 4
gpt4 key购买 nike

这是一个相当理论上的问题,但我的问题是,如果 lambda 是在模板函数内部定义的,但不依赖于类型 T 也不捕获任何东西(因此技术上可以在模板外部声明)被编译器识别和优化?优化是指两个 foo<int>foo<double>将使用相同的二进制代码 lam ,所以它不重复。也许,标准要求他们这样做吗?我试图对此进行分析,但我想到的唯一想法是在内部尝试静态变量,但不同类型的 lambda 不共享相同的静态变量并不是奇迹。

// foo with helper lam which is captureless and not T-dependant
template<typename T>
int foo(T x)
{
auto lam = [](int x) {std::cout << "foo" << std::endl; return -x; };
return lam(sizeof(x));
}

// foo with helper lam which is captureless and not T-dependant with static inside
template<typename T>
int foo_s(T x)
{
auto lam = [](int x) {static int count = 0; std::cout << "foo_s " << count++ << std::endl; return -x; };
return lam(sizeof(x));
}

int main()
{
foo(12); // foo
foo(12.0); // foo

foo_s(12); // foo_s 0
foo_s(12); // foo_s 1

foo_s(12.0); // foo_s 0
foo_s(12.0); // foo_s 1
return 0;
}

最佳答案

这两个相同的 lambda 的类型不同。它上面的operator()不一样。

如果您从不存储 lambda 的类型或以其他方式与之交互(这包括将其存储在 std::function 中),那么它是不同类型的事实是无关紧要的。如果您没有 static 局部变量或类似的 operator() 非同一性泄漏,它同样无关紧要。

在 MSVC 中,激进的 comdat 折叠将阻止两个相同的函数具有不同的存在。这包括两个函数被强制具有相同的地址。 GOLD 链接器做类似的事情,但不那么激进。

在 gcc 和 clang 中,除了某些操作,as-if 规则将允许它们丢弃冗余类型和函数。

该标准对低效程序代码几乎没有限制。编译器可以自由地注入(inject)一个 base-one noop 链来描述源代码的制表符缩进,或者任何其他同样疯狂的事情,比如无缘无故地拥有多个冗余的 lambda 函数体。

关于c++ - 模板函数中的无捕获 lambda 是否有多个二进制实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45825902/

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