|
You last visited: Today at 10:10
Advertisement
[Frage C++] Klassen-Memberfunktion inline
Discussion on [Frage C++] Klassen-Memberfunktion inline within the C/C++ forum part of the Coders Den category.
04/12/2014, 18:43
|
#1
|
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
|
[Frage C++] Klassen-Memberfunktion inline
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
|
#2
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
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
|
#3
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
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
|
#4
|
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
|
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: 
Antworten 1-5 fassen es gut zusammen.
|
|
|
04/13/2014, 15:46
|
#5
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Quote:
Originally Posted by MrSm!th
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
|
#6
|
elite*gold: 312
Join Date: May 2013
Posts: 449
Received Thanks: 45
|
Inline aus dem Gedächtnis löschen.....ok
|
|
|
04/13/2014, 19:12
|
#7
|
elite*gold: 55
Join Date: Mar 2006
Posts: 4,582
Received Thanks: 1,539
|
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<CRaumschiff> Spieler(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
|
#8
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
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
|
#9
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Quote:
Originally Posted by Nightblizard
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
|
#10
|
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
|
Quote:
Originally Posted by bloodx
und sagt der neue Standart nicht dass man lieber
PHP Code:
std::unique_ptr<CRaumschiff> Spieler(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
|
#11
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
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
|
#12
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
|
Tut er auch, wenn Ressourcen verwaltet werden. Dann kann man sehr schön RAII ausnutzen.
|
|
|
04/14/2014, 00:24
|
#13
|
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
|
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
|
#14
|
elite*gold: 5
Join Date: Sep 2006
Posts: 385
Received Thanks: 218
|
Quote:
Originally Posted by MrSm!th
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.
|
|
|
 |
Similar Threads
|
[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??
|
All times are GMT +1. The time now is 10:12.
|
|