c++ visual Ist es möglich, eine Funktion zu erzwingen, die nicht inline ist?




visual studio c++ tutorial deutsch (7)

Ist es möglich, eine Funktion zu erzwingen, die nicht inline ist?

Ich werde nicht einmal versuchen, diese Frage zu beantworten, denn es ist irrelevant, sich mit dieser Frage zu befassen, abgesehen von den beiden unten aufgeführten Gründen.

Inlining ist grundsätzlich

  1. eine Optimierung, die für Sie größtenteils transparent ist
  2. eine Möglichkeit, Funktionen in Headern zu definieren, ohne Multipile-Definitionsfehler zu bekommen

(Einige würden die Reihenfolge dieser beiden ändern, aber ich bleibe bei der traditionellen Reihenfolge.)

Es sei denn entweder A) Sie müssen unbedingt eine Funktion in einem Header definieren oder B) Sie profilieren und optimieren einen Code und wissen besser als der Compiler, was inline sein soll und was nicht, Inlining sollte für Sie keine Rolle spielen .
Es sollte sicherlich keine Sorge wegen des Debuggens sein. Ihr Debugger sollte dies (und im Falle von VC auch) für Sie erledigen.

Ich möchte eine kleine Funktion erzwingen, die nicht als Inline-Funktion kompiliert wird, auch wenn es sehr einfach ist. Ich denke, das ist nützlich für den Debug-Zweck. Gibt es ein Schlüsselwort dafür?


Ganz einfach: Lassen Sie den Compiler die Definition der Funktion nicht sehen. Dann kann es unmöglich inline sein. Das funktioniert natürlich nur, wenn es dein Code ist.

Wenn es darum geht, Code von Drittanbietern zu debuggen ... ja, das wäre nützlich, besonders wenn Sie Code von Drittanbietern aus der Ferne zappen könnten. Jeder, der Code debugged hat, der viel shared_ptr Dereferenzierung enthält, weiß, wovon ich spreche.


In Visual Studio 2010 weist __declspec(noinline) den Compiler an, nie eine bestimmte __declspec(noinline) , z.

class X {
     __declspec(noinline) int member_func() {
          return 0; 
     }
};

edit: Beim Kompilieren mit /clr werden Funktionen mit Sicherheitsattributen nie inline angezeigt (dies ist wiederum spezifisch für VS 2010).

Ich denke jedoch nicht, dass es beim Debugging überhaupt nützlich sein wird.


Wenn es sich um eine Memberfunktion einer Klasse handelt, machen Sie sie virtuell.


Sie können die Klassenimplementierung in eine Kopf- und eine CPP-Datei unterteilen. Wenn Sie die Funktion außerhalb der Klassendefinition platzieren, wird Ihre kleine Funktion nicht inline sein.


__declspec(noinline) für VC ++. Im Gegensatz zu der man-Seite scheint dies für freistehende Funktionen zu funktionieren, und ich glaube nicht, dass ich es jemals für eine Mitgliedsfunktion verwendet habe. Sie können - obwohl Sie bemerken, dass ich es nie getan habe - erwägen, auch mit den Optimierungsflags zu spielen, so dass nur inline Funktionen für das Inlining in Betracht gezogen werden, obwohl dies natürlich globale Auswirkungen hat und nicht unbedingt das ist, was Sie wollen.

__attribute__((noinline)) für gcc (und eine Anzahl weniger gebräuchlicher Compiler, die die Syntax des gcc-Attributs unterstützen). Ich muss zugeben, ich glaube nicht, dass ich das jemals benutzt habe, aber es scheint dort zu sein.

(Natürlich sind diese beiden Annotationsstile an verschiedenen Stellen angeordnet, daher ist es ein wenig ärgerlich, Code zu konstruieren, der für beide angenehm ist.)

Ich bin mir nicht sicher, wie diese beiden mit dem inline C ++ - Schlüsselwort interagieren. Ich habe sie nur beim Debuggen benutzt (wenn ich nur eine bestimmte nicht-inline-Funktion möchte, die nach der Optimierung nicht inline ist) oder wenn ich generierten Code untersuche (und ich bin verwirrt, weil zufällige Sachen inline sind).


Viele Compiler können Cross-Translation-Unit-Inlining durchführen. Visual Studio hat es seit fünf Jahren und ich glaube, dass GCC es jetzt tun kann - besonders, da das OP als Visual C ++ markiert ist, ist es eine faire Wette, dass sein Compiler damit zurechtkommt.

Der einfachste Weg, dies zu tun, ist, die Adresse der Funktion zu nehmen und dann etwas nicht Bedeutungsloses damit zu tun, wie es aufzurufen oder es an eine OS / externe Bibliotheksfunktion zu übergeben. Der Compiler kann diese Art von Funktion nicht verknüpfen.

Warum würdest du jemals, IDK wollen.

@Bemerkungen:

Wenn das OP srsly das braucht, dann könnte er es als lib kompilieren und statisch mit ihm verlinken.





visual-c++