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;
}
Lass inline weg und vertraue deinem Compiler. Inline garantiert sowieso nicht, dass die Methode tatsächlich inlined wird (afaik ignorieren moderne Compiler das sowieso).
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?
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.
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.
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.
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.
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.
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.
[C#] Klassen Frage 04/12/2014 - .NET Languages - 8 Replies Tag,
Ich hab eine Frage zu Klassen, ich hab eine Klasse für ein kleines Minispiel das für das kaufen der Items zuständig sein soll.
Das ganze soll dann so aussehen beim Buy Button.
private void btnItem1_Click(object sender, EventArgs e)
{
buyItem.BuyItem1.Price = 10;
Klassen Frage 09/24/2013 - Tera - 6 Replies Hallo Epvp,
ich habe mir das Spiel geladen und stehe nun vor der Frage welche Klasse und Welches Volk ich nehmen soll.
Da habe ich ein paar Fragen, kann man alle zu jedem Volk auch jede Klasse nehmen?
Möchte gerne den Popori nehmen, kann ich ich den als Berserker Spielen oder ist es als Mystiker besser, da sein Bild bei Mystiker abgebildet ist.
Bzw. was wären Vor -und Nachteile zwischen Berserker und Mystiker?
Frage zu Klassen 11/03/2011 - Aion - 15 Replies Ich hätte eine Frage und zwar welche Klasse bringt denn am meisten Spaß und wird nicht so schnell Langweilig?
Danke im vorraus
Frage zu Klassen 09/13/2011 - World of Warcraft - 15 Replies Welche Klasse wäre für ein Anfänger perfekt um das Game kennenzulernen?
[us] Klassen frage 11/02/2009 - Metin2 - 1 Replies Hätte da mal ne frage ist der Wasu aufm us Server genauso imba wie in der korea version? und ist wasu besser als krieger??