[Frage C++] Klassen-Memberfunktion inline

04/12/2014 18:43 KingwondA#1
Heey,
Wenn ich eine Klasse habe die eine Memberfunktion enthält und ich diese Inline machen möchte, muss ich sie in der Klasse nur Inline machen, oder auch dort, wo ich sie defeniere?

bsp:
Code:
// C++ für Spieleprogrammierer
// Listing 7.3
// Private Membervariablen
//
#include <iostream>

using namespace std;

// Konstanten
//
const int Bildschirmbreite = 800;
const int Bildschirmhoehe = 600;

// Klassen
//
class CRaumschiff
{
private:

	// Membervariablen
	int m_xPos;   // x-Position auf dem Bildschirm
	int m_yPos;   // y-Position auf dem Bildschirm

public:

void SetzeKoordinaten(const int x, const int y); <--- hier inline?
};

// SetzeKoordinaten
//
// Aufgabe: Neue Bildschirmkoordinaten setzen
//
void CRaumschiff::SetzeKoordinaten(const int x, const int y) <----- hier inline?
{
	// Prüfe, ob die neuen Koordinaten gültig sind
	if (x > 0 && x < Bildschirmbreite && y > 0 &&
		y < Bildschirmhoehe)
	{
		// Wenn ja, dann neue Koordinaten setzen
		m_xPos = x;
		m_yPos = y;

		cout << "Neue Koordinaten gesetzt!" << endl;
	}
	else
	{
		// Wenn nicht, Fehlermeldung ausgeben
		cout << "Fehler: Koordinaten ausserhalb des Bereichs!";
	}

	cout << endl;

} // SetzeKoordinaten

// Hauptprogramm
//
int main()
{
	// Variablen
	//
	CRaumschiff Spieler;  // Ein Raumschiff für den Spieler

	// Neue Koordinaten setzen
	Spieler.SetzeKoordinaten(150, 300);
	Spieler.SetzeKoordinaten(180, 620);

	return 0;
}
04/12/2014 19:49 Schlüsselbein#2
Lass inline weg und vertraue deinem Compiler. Inline garantiert sowieso nicht, dass die Methode tatsächlich inlined wird (afaik ignorieren moderne Compiler das sowieso).
04/13/2014 13:47 MrSm!th#3
Gibts nicht auch noch __forceinline?
Und wenn ich mich recht erinnere, garantiert der Standard doch, dass eine "inline" definierte Methode (sprich direkt in der Klassendefinition wird auch die Methode vollständig definiert, wie das bei Templates die Regel ist) auch beim Maschinencode inlined wird, oder vertue ich mich da?
04/13/2014 15:01 Schlüsselbein#4
Inline ist afaik nur ein Hinweis für den Compiler. War früher scheints wichtiger, wird heute aber nicht mehr gebraucht. Die Compiler sind sowieso fast immer schlauer, wenns ums optimieren von so trivialen Dingen geht.
Vergleichbar mit dem keyword 'register'.

Ggf musst mal nach dem genauen Wortlaut des Standards suchen, aber ich bin mir zu 90% sicher.


Edit: Die Sache mit dem inline in der Klassendefinition ist glaub nochmal ein anderes Thema und geht glaub ich ein anderes Problem an.

Edit2: [Only registered and activated users can see links. Click Here To Register...]
Antworten 1-5 fassen es gut zusammen.
04/13/2014 15:46 Nightblizard#5
Quote:
Originally Posted by MrSm!th View Post
Gibts nicht auch noch __forceinline?
Und wenn ich mich recht erinnere, garantiert der Standard doch, dass eine "inline" definierte Methode (sprich direkt in der Klassendefinition wird auch die Methode vollständig definiert, wie das bei Templates die Regel ist) auch beim Maschinencode inlined wird, oder vertue ich mich da?
Nein, der Standard sagt ganz eindeutig, dass der Compiler das nicht machen muss.

Quote:
A function declaration (8.3.5,9.3,11.4) with an inline specifier declares an inline function. The inline specifier indicates to the implementation that inline substitution of the function body at the point of call is to be preferred to the usual function call mechanism. An implementation is not required to perform this inline substitution at the point of call; however, even if this inline substitution is omitted, the other rules for inline functions defined by 7.1.2 shall still be respected.
Und zu __forceinline sagt msdn:
Quote:
The __forceinline keyword overrides the cost/benefit analysis and relies on the judgment of the programmer instead. Exercise caution when using __forceinline. Indiscriminate use of __forceinline can result in larger code with only marginal performance gains or, in some cases, even performance losses (due to increased paging of a larger executable, for example).
Also vergesst den ganzen inline Quatsch am Besten. Der Compiler weiß besser was er inlinen soll und was nicht.


@TE:
Kauf dir ein anderes Buch.
04/13/2014 19:01 KingwondA#6
Inline aus dem Gedächtnis löschen.....ok :D
04/13/2014 19:12 bloodx#7
PHP Code:
using namespace std
keine schöne schreibweise, solltest du dir vielleicht auch abgewöhnen für die Zukunft.

und sagt der neue Standart nicht dass man lieber
PHP Code:
std::unique_ptr<CRaumschiffSpieler(new CRaumschiff);
bzw.
auto Spieler std::unique_ptr<CRaumschiff>(new CRaumschiff); 
benutzen sollte ?
wäre gut wenn jemand auch mir dazu etwas sagen könnte :)
04/13/2014 19:23 Delinquenz#8
Quote:
wäre gut wenn jemand auch mir dazu etwas sagen könnte
Mit C++14 sagt er (der Standard schreibt eigentlich nichts vor), dass du auto Spieler = std::make_unique<CRaumschiff>(); benutzen sollst.

Auch wenn das in der Praxis wegoptimiert wird, ist in der Theorie die direkte Initialisierung schneller das die Nutzen des Zuweisungsoperatoren. Heißt, wenn kein C++14 verfügbar, benutzt du dein erstes Beispiel.
04/13/2014 19:46 MrSm!th#9
Quote:
Originally Posted by Nightblizard View Post
Nein, der Standard sagt ganz eindeutig, dass der Compiler das nicht machen muss.
Ich sprach explizit nicht vom inline Schlüsselwort. Siehe die Klammern.
Gemeint war Folgendes:
Code:
template<class T>
struct Abc
{
    void func() { /* do fancy stuff */ }
};
04/13/2014 20:05 Tasiro#10
Quote:
Originally Posted by bloodx View Post
und sagt der neue Standart nicht dass man lieber
PHP Code:
std::unique_ptr<CRaumschiffSpieler(new CRaumschiff);
bzw.
auto Spieler std::unique_ptr<CRaumschiff>(new CRaumschiff); 
benutzen sollte ?
wäre gut wenn jemand auch mir dazu etwas sagen könnte :)
Nein, wenn es auf dem Stapel liegen kann, dann soll es da bleiben und nicht dynamisch verwaltet werden.
04/13/2014 21:34 Delinquenz#11
Falls das Objekt nicht explizit auf dem Heap liegen soll, ist das von mir Geschriebene natürlich Schwachsinn. Wenn man es nicht unbedingt auf dem Heap haben möchte, dann sollte man es normal auf dem Stack anlegen. Da hat Tasiro vollkommen recht.

Mein Beitrag war darauf bezogen, wenn man den Heap benutzen möchte. Bei Klassen, die keine Ressourcen oder Ähnliches verwalten, reicht der Stack vollkommen.
04/13/2014 21:49 MrSm!th#12
Tut er auch, wenn Ressourcen verwaltet werden. Dann kann man sehr schön RAII ausnutzen.
04/14/2014 00:24 Delinquenz#13
Quote:
Tut er auch, wenn Ressourcen verwaltet werden. Dann kann man sehr schön RAII ausnutzen.
Stimmt, man kann auch direkt das ressourcenlastige Objekt innerhalb der Klasse auf dem Heap anlegen :) Gibt leider Bibliotheken, die das nicht pflegen und den Heap voraussetzen.
04/14/2014 10:32 Nightblizard#14
Quote:
Originally Posted by MrSm!th View Post
Ich sprach explizit nicht vom inline Schlüsselwort. Siehe die Klammern.
Gemeint war Folgendes:
Code:
template<class T>
struct Abc
{
    void func() { /* do fancy stuff */ }
};
Dazu sagt der Standard:
Quote:
A member function may be defined (8.4) in its class definition, in which case it is an inline member function (7.1.2), ...
Und unter 7.1.2 ist der von mir vorher genannte Punkt, dass der Compiler das nicht zwangsweise inlinen muss. Also ja, das impliziert inline, aber der Compiler ignoriert das.