Gibt es eine Technik, um alle privaten Mitgliedsfunktionen zu einer internen Verknüpfung zu zwingen?C++

Programme in C++. Entwicklerforum
Guest
 Gibt es eine Technik, um alle privaten Mitgliedsfunktionen zu einer internen Verknüpfung zu zwingen?

Post by Guest »

Wenn der folgende Code mit -O3 und -fPIC kompiliert wird, kann der Compiler Foo::priv() nicht einbinden, da er über eine externe Verknüpfung verfügt. Im Gegensatz dazu kann Foo::priv2() inline sein, da es über eine interne Verknüpfung verfügt. Live im Compiler Explorer

Code: Select all

// foo.hpp
class Foo {
public:
int fn();
int fn2();

private:
static int priv();
static __attribute__((visibility("hidden"))) int priv2();
};

// foo.cpp
#include 

template 
int run(Func func)
{
int sum = 0;
for (int i = 0; i < 10'000'000; ++i) {
sum += func();
}
return sum;
}

int Foo::fn() { return run(&Foo::priv); }
int Foo::fn2() { return run(&Foo::priv2); }

int Foo::priv() { return 1; }
int Foo::priv2() { return 1; }
Ich erkenne an, dass der Compiler Foo::fn() nicht durch Inlining von Foo::priv() optimieren kann, da dies für a) einige möglich ist andere dynamische Bibliothek, um eine Implementierung für Foo::priv() bereitzustellen, und b) die andere dynamische Bibliothek wird zuerst verknüpft. Im obigen Code sind die Kosten für das Nicht-Inlining von Foo::priv() erheblich.
Stellen Sie sich eine große Codebasis mit vielen gemeinsam genutzten Bibliotheken und vor > Es kann garantiert werden, dass genau eine gemeinsam genutzte Bibliothek eine Definition für eine private Member-Funktion bereitstellt. Wenn es hilfreich ist, kann diese Garantie auf alle Mitgliedsfunktionen ausgeweitet werden.
Gibt es in dieser Situation eine praktikable Option zum Kompilieren des Codes, um Inlining für Foo::priv()< zu ermöglichen /code> ohne manuelle Angabe der Sichtbarkeit (oder manuelles Inlining des Codes)?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post