#include <cstdint>
#include <functional>
struct A {
virtual void Bar() = 0;
virtual std::function<void(void)> Baz() = 0;
};
__attribute__((noinline)) void Foo(A& a) {
for(size_t i = 0; i < 100000000; ++i)
a.Bar();
}
__attribute__((noinline)) void Foz(A& a) {
std::function<void(void)> baz = a.Baz();
for(size_t i = 0; i < 100000000; ++i)
baz();
}
struct B final : A {
void Bar() override { }
std::function<void(void)> Baz() override { return []() { }; }
};
int main() {
B b;
#if 1
Foo(b);
#else
Foz(b);
#endif
return 0;
}
I2luY2x1ZGUgPGNzdGRpbnQ+CiNpbmNsdWRlIDxmdW5jdGlvbmFsPgoKc3RydWN0IEEgewoJdmlydHVhbCB2b2lkIEJhcigpID0gMDsKCXZpcnR1YWwgc3RkOjpmdW5jdGlvbjx2b2lkKHZvaWQpPiBCYXooKSA9IDA7Cn07CgpfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIHZvaWQgRm9vKEEmIGEpIHsKCWZvcihzaXplX3QgaSA9IDA7IGkgPCAxMDAwMDAwMDA7ICsraSkKCQlhLkJhcigpOwp9CgpfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpIHZvaWQgRm96KEEmIGEpIHsKCXN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYmF6ID0gYS5CYXooKTsKCWZvcihzaXplX3QgaSA9IDA7IGkgPCAxMDAwMDAwMDA7ICsraSkKCQliYXooKTsKfQoKc3RydWN0IEIgZmluYWwgOiBBIHsKCXZvaWQgQmFyKCkgb3ZlcnJpZGUgeyB9CglzdGQ6OmZ1bmN0aW9uPHZvaWQodm9pZCk+IEJheigpIG92ZXJyaWRlIHsgcmV0dXJuIFtdKCkgeyB9OyB9Cn07CgppbnQgbWFpbigpIHsKCUIgYjsKI2lmIDEKCUZvbyhiKTsKI2Vsc2UKCUZveihiKTsKI2VuZGlmCglyZXR1cm4gMDsKfQ==