Frage

Ich habe die Prüfung Inline-Funktionsaufrufe in C ++.

Thread model: win32
gcc version 4.3.3 (4.3.3-tdm-1 mingw32)

Stroustrup in der C ++ Programmiersprache wirtes:

  

Der Inline-Bezeichner ist ein Hinweis an den Compiler, der es versuchen sollte Code [...] inline zu erzeugen, anstatt den Code zur Festlegung der für die Funktion einmal und dann durch die üblichen Funktionsaufruf Mechanismus aufrufen.

Allerdings habe ich herausgefunden, dass der generierte Code ist einfach nicht inline. Es gibt eine CALL- instrction für die iSquare Funktion.

Warum ist das passiert? Wie kann ich Inline-Funktionen verwenden dann?

EDIT: Die Befehlszeilenoptionen verwendet:

**** Build of configuration Debug for project InlineCpp ****

**** Internal Builder is used for build               ****
g++ -O0 -g3 -Wall -c -fmessage-length=0 -osrc\InlineCpp.o ..\src\InlineCpp.cpp
g++ -oInlineCpp.exe src\InlineCpp.o
War es hilfreich?

Lösung

Es gibt keine generischen C ++ Art und Weise den Compiler FORCE Inline-Funktionen zu erstellen. Beachten Sie das Wort ‚Hinweis‘ im Text zitiert -. Die Compiler nicht auf Sie zu hören ist verpflichtet,

Wenn Sie wirklich, absolut müssen etwas in-line machen sein, erhalten Sie einen Compiler bestimmtes Schlüsselwort benötigen, oder Sie werden Makros müssen Funktionen statt verwenden.

EDIT: njsf gibt das richtige gcc Schlüsselwort in seiner Antwort

.

Andere Tipps

Wie Michael Kohne erwähnt, ist die Inline-Schlüsselwort ist immer ein Hinweis, und GCC im Falle Ihrer Funktion entschieden, es nicht zu inline.

Da Sie gcc verwenden Sie inline mit dem __attribute zwingen kann ((always_inline)).

Beispiel:

 /* Prototype.  */
 inline void foo (const char) __attribute__((always_inline));

Quelle: GCC Inline-docs

Sind Sie an einem Debug-Build suchen (Optimierungen deaktiviert)? Compiler in der Regel deaktivieren inlining in „debug“ baut, weil sie härter Debugging bei.

In jedem Fall angegeben die inline ist in der Tat ein Hinweis . Der Compiler ist nicht die Funktion Inline erforderlich. Es gibt eine Reihe von Gründen, warum jeder Compiler entscheiden, könnte einen Inline-Hinweis zu ignorieren:

  • Ein Compiler könnte einfach sein, und nicht unterstützen inlining
  • Ein Compiler kann einen internen Algorithmus verwenden zu entscheiden, was die Hinweise Inline und zu ignorieren.
    (manchmal, kann der Compiler einen besseren Job machen, als Sie sich bei der Auswahl, was Inline tun können, vor allem in komplexen Architekturen wie IA64)
  • könnte ein Compiler seine eigene Heuristik verwenden, um zu entscheiden, dass trotz des Hinweises, inlining wird nicht die Leistung verbessern

Inline ist nichts anderes als ein Vorschlag an den Compiler, der, wenn es möglich ist, diese Funktion Inline dann sollte der Compiler dabei zu berücksichtigen. Einige Funktionen, die es automatisch Inline werden, weil sie so einfach sind, und andere Funktionen, die Sie vorschlagen es inlines es nicht, weil sie zu komplex sind.

Auch ich bemerkte, dass Sie ein Debug-Build tun. Ich weiß nicht wirklich, aber es ist möglich, dass der Compiler inlining für Debug deaktiviert baut, weil es die Dinge schwierig für den Debugger macht ...

Es ist ein Hinweis und die complier Dose Wahl den Hinweis zu ignorieren. Ich glaube, ich einige lesen, wo die GCC es in der Regel ignorieren. Ich erinnere hören gibt es eine Flagge, aber es immer noch nicht in 100% der Fälle arbeiten. (Ich habe nicht einen Link noch nicht gefunden).

Flag. -Finline-Funktionen eingeschaltet werden bei O3 Optimierungsstufe auf

Ob Inline ist für den Compiler auf. Ist es frei, die inline Hinweis zu ignorieren. Einige Compiler haben ein bestimmtes Schlüsselwort (wie __forceinline in VC ++), sondern auch mit einem solchen Stichwort virtuelle Anrufe auf virtuelle Member-Funktionen werden nicht inlined werden.

ich konfrontiert ähnliche Probleme und fand, dass es funktioniert nur, wenn die Inline-Funktion in einer Header-Datei geschrieben wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top