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

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

1

07.03.2005, 21:24

Inline Templates erzwingen

Hallo :) :) :)


Aus einem schwerwiegenden Grund möchte ich Templates bei jeder Verwendung inline einfügen lassen (ich möchte Templates wie Makros verwenden).

Also hab ichs so versucht:

template <typename TTyp> __forceinline void TemplateFunktion(void)
{

}

Ich bin mir aber nicht sicher, ob das wirklich jedesmal als Codeersetzung behandelt wird... Vielleicht weiß jemand ob das Ding so funktioniert, oder wie ich es sonst machen soll.


Samuel G.
Quak

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

2

08.03.2005, 19:02

ist das nicht witzlos, da intern vom compiler für jeden typ des template-parameters eine neue version der template-klasse erzeugt wird?
bei echten genersichen klassen wäre das was anderes, so sind es im prinzip doch nur "normale" klassen, die nur automatisch erzeugt werden...

Samuel G.

Treue Seele

  • »Samuel G.« ist der Autor dieses Themas

Beiträge: 110

Wohnort: Stuttgart

Beruf: Schüler

  • Private Nachricht senden

3

09.03.2005, 13:31

Nun Ja

Nun ja, ich will halt die Funktionalität eines Makros mit Hilfe eines Templates haben.

Ich hab gesagt "Aus einem schwerwiegenden Grund", weil das nicht in ein paar Worten zusammengefasst ist. Auf jeden Fall ist es nicht "witzlos".
Ich bin grad in der Schule und hab nich viel Zeit; werd aber vielleicht demnächst noch den Zweck meiner Vorgehensweise erklären...

Nochmal: wird wenn ich es so mache wie gezeigt, wird die Template-Funktion dann immer inline eingefüg?


Samuel G.
Quak

Dave

Alter Hase

Beiträge: 757

Wohnort: Berlin

  • Private Nachricht senden

4

09.03.2005, 16:36

sry, hatte nen denkfehler....

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

5

10.03.2005, 17:03

__forceinline ist 'ne Microsoft-Erweiterung, die genau das machen soll, also ist die Antwort ja (solange es um den MSVC geht).
Wenn es sich um eine kurze Funktion handlet kann man aber davon ausgehen, das sie eh geinlined wird.
Wenn es ne lange ist sollte man erst mal profilen, ob durch solche Maßnahmen der Code nicht verlangsamt wird (Code wird zu groß, Cache zu voll => langsam, etc.).
Why is 6 afraid of 7?
Because 7 8 9

Anonymous

unregistriert

6

10.03.2005, 19:52

moin,
soweit ich weiss, kann man beim msvc einstellen, wie der compiler auf inline bzw. forceinline reagieren soll. wie schon erwaehnt ist forceinline eine ms-erweiterung, die aus einem guten grund sehr sinnlos ist. inline ist im standard als vorschlag an den compiler, die funktion zu inlinen, definert.der compiler muss nicht kann, d.h. bei einem standardconformen compiler gilt:
void foo () == inline void foo ();
jetzt muesste die frage kommen, warum es das keyword inline ueberhaupt gibt. naja zum einem gibt es einstellungen den compiler zu zwingen hier zu inlinen. der standard hat das aber nicht einfach zum spass so gemacht, sondern mit folgendem sinn:
der compiler weiss besser, wann welche funktion zu inlinen ist, als der programmierer !
deswegen ist forceinline und das daraus resultierende verhalten des compilers nicht zu empfehlen. ueberlass es dem compiler, denn der kann besser solch micro-tuning als ein mensch.

mfg,
google.com

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

7

11.03.2005, 13:48

Du hast da aber was übersehen. inline hat eigentlich eine ganz andere Aufgabe:

Schreib mal folgenden Header:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifndef DER_INCLUDEGUARD
#define DER_INCLUDEGUARD

#include <iostream>

inline void foo ()
{
   std::cout << "foo\n";
}

void bar ()
{
   std::cout << "bar\n";
}

#endif



Dann binde diesen Header in mindestens zwei Module ein. bar wird einen Fehler verursachen, foo hingegen nicht. Inline-Funktionen können in beliebig vielen Modulen definiert werden, normale Funktionen hingegen nicht.
Why is 6 afraid of 7?
Because 7 8 9

Anonymous

unregistriert

8

11.03.2005, 21:22

das inline was ganz anderes macht, ist wohl falsch ausgedrueckt :)
dennoch muss ich dich enttaeuschen, lies dir mal diesen artikel durch:
http://www.informit.com/guides/content.a…seqNum=174&rl=1
ich will mal daraus zitieren:

Zitat


In pre-standard C++, inline affected the linkage type of a function. This is not the case anymore. In standard C++, inline has no effect on the linkage of a function.

also, der compiler den du benutzt hast ist endlos veraltet. meine empfehlung waere, dir einen neuen zu besorgen und zwar sofort.

mfg,
google.com

helium

Treue Seele

Beiträge: 180

Wohnort: NRW, Burscheid (nahe Köln)

  • Private Nachricht senden

9

12.03.2005, 16:51

Zitat von »"Der C++Standard"«


3.2 One definition rule

§3
Every program shall contain exactly one definition of every non-inline function or object that is used in that program; no diagnostic required. The definition can appear explicitly in the program, it can be found in the standard or a user-defined library, or (when appropriate) it is implicitly defined. An inline function shall be defined in every translation unit in which it is used.

§5
There can be more than one definition of a class type, enumeration type, inline function with external linkage[b], class template, non-static function template, static data member of a class template, member function template, or template specialization for which some template parameters are not specified in a program provided that each definition appears in a different translation unit, and provided the definitions satisfy the following requirements.
[...]


Aber ja, inline-Funktionen haben external linkage.

Zitat von »"Der C++ Standard"«


7.1.1 Storage class specifiers

§7
[...]
inline void h(); // external linkage
[...]
Why is 6 afraid of 7?
Because 7 8 9

10

12.03.2005, 17:21

Zitat von »"helium"«

Zitat von »"Der C++Standard"«


§7
[...]
inline void h(); // external linkage
[...]


krieg ich dafür mal bitte ein beispiel?
bei mir funktioniert das nicht:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//irgendeinheader.h

#pragma once
void inline f1();
//--------------


//irgendeincpp.cpp

void inline f1(){
}
//-------------


//einanderesfile.cpp

#include "irgendeinheader.h"

int main(){
   f1();
   return 0;
}

Werbeanzeige