#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();
}
При компиляции с g++ - 7 -O3 -flto -fdevirtualize-at-ltrans -fipa-pta -fuse-linker-plugin
вышеупомянутый ptr->f()
не может быть девиртуализирован.
Кажется, что никакая внешняя библиотека не может изменять ptr
. Является ли это недостатком оптимизатора GCC или потому, что некоторые другие источники делают недоступным в этом случае девиртуализацию?
UPDATE: Кажется, что clang-7 с -flto -O3 -fwhole-program-vtables -fvisibility=hidden
является единственным флагом компилятора + (как в 2018/03), который может девиртуализировать эту программу.