#include <cstdio>
#include <cstdlib>
struct Interface {
virtual void f() = 0;
};
struct Impl1: Interface {
void f() override {
std::puts("foo");
}
};
// or __attribute__ ((visibility ("hidden")))/anonymous namespace
static Interface* const ptr = new Impl1 ;
int main() {
ptr->f();
}
Lorsqu'il est compilé avec g++-7 -O3 -flto -fdevirtualize-at-ltrans -fipa-pta -fuse-linker-plugin
, au-dessus de la ptr->f()
appel ne peut pas être devirtualized.
Il semble qu'aucune bibliothèque externe peut modifier ptr
. Est-ce une carence de GCC optimiseur, ou parce que certains autres sources de devirtualization indisponible, dans ce cas?
Mise à JOUR:
Il semble que clang-7 -flto -O3 -fwhole-program-vtables -fvisibility=hidden
est le seul compilateur+drapeaux (comme dans 2018/03) qui peuvent devirtualize ce programme.