Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

16.10.2012, 18:37

[C++] Wieso wird 'inline' nicht berücksichtigt?

Hey Leute,

ich habe aus Interesse mal eine simple Klasse einmal in einer Headerdatei (mit inline) und einmal in einer Codedatei definiert.
Damit wollte ich testen ob das inline überhaupt berücksichtigt wird, und siehe da: Nein.
Dabei ist die Klasse sehr simpel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Vector2
{
  Vector2(float x, float y)
    : x(x), y(y)
  { }

  float x, y;
};

inline const Vector2 operator +(const Vector2& left, const Vector2& right)
{
  return Vector2(left.x + right.x, left.y + right.y);
}


Das gleiche habe ich nochmal ohne das inline und einmal mit den Definitionen in einer *.cpp.
Jetzt ist meine Frage: Wieso ist der daraus resultierende Assembler-Code komplett identisch?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

16.10.2012, 18:41

Jetzt ist meine Frage: Wieso ist der daraus resultierende Assembler-Code komplett identisch?

Weil dein Compiler sehr schlau ist und auch noch inlined, wenn die Funktion in der .cpp Datei definiert ist... ;)

3

16.10.2012, 18:47

Weil dein Compiler sehr schlau ist und auch noch inlined, wenn die Funktion in der .cpp Datei definiert ist...

Dann ist Visual C++ 2012 sehr schlau. :D
Dann kann ich ja genau so gut alles (außer templates) in *.cpp's schreiben, wenn inline sogut wie keine Bedeutung mehr hat ...

Edit: Dazu ist Link-time Code Generation also da. Danke.

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

4

16.10.2012, 18:49

Es gibt im Übrigen auch den anderen Fall, dass dein Compiler sehr dumm ist, und trotz inline trivialste Funktionen nicht inlinet. Und es gibt den Fall, dass Inlining einfach ausgeschaltet ist, z.B. in Debug-Builds. Und es gibt den Fall, dass dein Compiler sehr schlau ist und trotz inline nicht inlinet, weil der resultierende Code nicht besser wäre. Kurz: inline ist nur ein sehr unverbindlicher Hinweis an den Compiler, der in modernen Compilern ggf. vollständig ignoriert wird.
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

5

16.10.2012, 18:53

Wenn das so ist, lasse ich inline einfach immer weg. Trägt imho auch zur Lesbarkeit dazu.
Danke für die Antworten. :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

16.10.2012, 18:56

Dann kann ich ja genau so gut alles (außer templates) in *.cpp's schreiben, wenn inline sogut wie keine Bedeutung mehr hat ...

inline hat schon eine Bedeutung, aber der primäre Zweck von inline ist heutzutage nicht unbedingt, dass der Compiler inlined (wie du gesehen hast, macht er das sowieso von selbst), sondern, dass eine Funktionsdefinition in mehreren Übersetzungseinheiten (.cpp Files) vorkommen kann (wenn du z.B. eine Funktion in einem Header definierst, wirst du Linkerfehler bekommen, wenn du sie nicht inline machst). Bedenke aber auch, dass nicht unbedingt jeder Compiler LTCG bzw. Whole Program Optimization unterstützt...

Edit: Vermutlich auch noch interessant für dich: http://www.zfx.info/viewtopic.php?f=11&t=2501#p32900

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »dot« (16.10.2012, 19:08)


7

16.10.2012, 19:32

Jetzt habe ich inline endlich verstanden. Danke!

Vermutlich auch noch interessant für dich: http://www.zfx.info/viewtopic.php?f=11&t=2501#p32900

Ist sogar sehr interessant!

SullY

Treue Seele

Beiträge: 103

Wohnort: Vor dem PC :P

Beruf: Schulbankdrücker, Samstagsprospektzeitungsjunge,

  • Private Nachricht senden

8

04.11.2012, 17:13

Ob inline berücksichtigt wird hängt vom Compiler ab.
Spruch Lädt... 99 % . Verbindung abgestürzt.

My best Code is written with the Delete Key.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

04.11.2012, 17:20

Wenn du meinst, dass der Compiler eine als inline deklarierte Funktion nicht inlinen muss, dann ja. Aber der Compiler muss auf jeden Fall alle anderen mit inline verbundenen Dinge, insbesondere eben die Ausnahme in der one definition rule berücksichtigen, wie ich hier ja auch schon genau erklärt hab... ;)

CodingCat

1x Contest-Sieger

Beiträge: 420

Beruf: Student (KIT)

  • Private Nachricht senden

10

05.11.2012, 10:32

Ob inline berücksichtigt wird hängt vom Compiler ab.

Sammelst du Beiträge für deinen Beitragszähler? ;)
alphanew.net (last updated 2011-06-26) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite

Werbeanzeige