Ist es sinnvoll, Vorlagen in Headern zu definieren und der Compiler zu bestimmen, ob das Inlining einer Funktion vorteilhaft ist? Ich habe gehört, dass moderne Compiler besser wissen, wann sie eine Funktion einbinden müssen, und inline
Hinweise ignorieren .
edit: Ich möchte beide Antworten akzeptieren, aber das ist nicht möglich. Um das Problem zu schließen, akzeptiere ich die Antwort von phresnel , da sie die meisten Stimmen erhalten hat und er formal Recht hat, aber wie ich in den Kommentaren erwähnt habe, betrachte ich die Antworten von Puppy und Component 10 aus verschiedenen Blickwinkeln auch als richtig .
Das Problem liegt in der C ++ - Semantik, die bei inline
Schlüsselwörtern und Inlining nicht streng ist . phresnel sagt "schreibe inline, wenn du es ernst meinst", aber was eigentlich damit gemeint inline
ist, ist nicht klar, da es sich von seiner ursprünglichen Bedeutung zu einer Direktive entwickelt hat, die "Compiler davon abhält, über ODR-Verstöße zu meckern", wie Puppy sagt.
inline
nur, weil die spezialisierte Vorlage mit markiert istinline
. Soinline
auf der Schablone ist völlig irrelevant. Ob diese Funktion sein sollteinline
oder nicht, hat nichts damit zu tun, dass sie über eine Vorlagenspezialisierung generiert wird (und es gibt bessere Antworten als diese, die angeben, wann sie verwendet werden sollinline
). Die Antwort von @Puppy unten ist richtig, diese nicht. Das Hinzufügeninline
einer Vorlage ist irrelevant undclang-tidy
wird tatsächlich entfernt.inline
nicht irrelevant ist, sollte das Beispiel den Fall einer expliziten Spezialisierungtemplate<> void f<>(int) {}
ohne dasinline
Schlüsselwort abdecken . Aber selbst dann macht das Ändern desinline
Bezeichners in der Vorlage keinen Unterschied, dainline
es unerheblich ist , ob Sie die Vorlage markieren oder nicht.Es ist irrelevant. Alle Vorlagen sind bereits vorhanden
inline
- ganz zu schweigen davon, dass dasinline
Schlüsselwort ab 2012 nur verwendet wird, um zu verhindern, dass Compiler über ODR-Verstöße meckern. Sie sind absolut korrekt - Ihr Compiler der aktuellen Generation weiß, was er selbst einbinden muss, und kann dies wahrscheinlich auch zwischen Übersetzungseinheiten tun.quelle
inline
markierte Funktionen (dh, es können mehrere äquivalente Definitionen an den Linker übergeben werden, der eine auswählt). Das, nicht Inlining, ist die eigentliche Funktion desinline
Schlüsselworts.inline
. Vielleicht werfen Sie einen Blick auf meine Antwort unten (oder oben, je nach gewählter Sortierung). Bei nicht spezialisierten Vorlagen haben Sie natürlich Recht, aber formal ist es nicht dasselbe.inline
was inline sein soll. Es macht normalerweise keinen Unterschied, aber auf Standard sind sie nicht gleich und sie sind nicht alle inline. Ich akzeptiere Ihre Haltung dazu und sage "Es ist irrelevant", aber laut Standard sind nicht alle Vorlagen inline, nur für Sie als C ++ - Benutzer erscheinen sie so, als ob.Wie Sie vorgeschlagen haben,
inline
ist ein Hinweis auf den Compiler und nichts weiter. Es kann wählen, ob es ignoriert oder Inline-Funktionen verwendet werden sollen, die nicht als Inline markiert sind.Die Verwendung
inline
mit Vorlagen war früher eine (schlechte) Methode, um das Problem zu umgehen, dass jede Kompilierungseinheit ein separates Objekt für dieselbe Vorlagenklasse erstellt, das dann zum Zeitpunkt der Verknüpfung zu Duplizierungsproblemen führt. Durch die Verwendunginline
(glaube ich) funktioniert das Namens-Mangeln anders, wodurch der Namenskonflikt zur Link-Zeit umgangen wird, jedoch auf Kosten von stark aufgeblähtem Code.Marshall Cline erklärt es hier besser als ich.
quelle
§14.5.5.1 p7 & p8
) ausgenommen sind . Mein schlechtes, ich habe den falschen Kommentar entfernt.