Czy używanie słów kluczowych w wierszu z szablonami ma sens?

Ponieważ szablony są zdefiniowane w nagłówkach i kompilator jest w stanie określić, czy inlining funkcji jest korzystny, czy ma to jakiś sens? Słyszałem, że nowoczesne Kompilatory lepiej wiedzą, kiedy wstawiać funkcję i ignorują podpowiedź inline.


Edit: chciałbym zaakceptować obie odpowiedzi, ale nie jest to możliwe. Na zakończenie sprawy przyjmuję odpowiedź phresnela , ponieważ otrzymał najwięcej głosów i formalnie ma rację, ale jak wspomniałem w komentarzach uważam Puppy 'S IComponent 10 'S odpowiedzi również jako poprawne, z innego punktu widzenia.

Problem jest w semantyce C++, która nie jest ścisła w przypadku inline słów kluczowych i inliningu. phresnel mówi "write inline if you mean it", ale to, co tak naprawdę oznacza inline, nie jest jasne, ponieważ ewoluowało ze swojego pierwotnego znaczenia do dyrektywy, która "przestaje narzekać kompilatorów o naruszeniach ODR", jak mówiPuppy .

Author: doc, 2012-05-10

3 answers

To nie jest nieistotne. I nie, nie każdy szablon funkcji jest domyślnie inline. Standard jest nawet explicit o tym w Explicit specjalizacja ([temp.expl.spec])

Mieć następujące:

a.cc

#include "tpl.h"

b.cc

#include "tpl.h"

tpl.h (zaczerpnięte z wyraźnej specjalizacji):

#ifndef TPL_H
#define TPL_H
template<class T> void f(T) {}
template<class T> inline T g(T) {}

template<> inline void f<>(int) {} // OK: inline
template<> int g<>(int) {} // error: not inline
#endif

Skompiluj To, et voila:

g++ a.cc b.cc
/tmp/ccfWLeDX.o: In function `int g<int>(int)':
inlinexx2.cc:(.text+0x0): multiple definition of `int g<int>(int)'
/tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here
collect2: ld returned 1 exit status

Nie podanie inline podczas wykonywania jawnej instancji może również prowadzić do problemy.

Tak więc w podsumowaniu: Dla Nie w pełni wyspecjalizowanych szablonów funkcji, tj. tych, które mają co najmniej jeden Nieznany typ, można pominąć inline i nie otrzymać błędów, ale nadal nie są one inline. W przypadku pełnych specjalizacji, tj. tych, które używają tylko znanych typów, nie można tego pominąć.

Proponowana zasada : napisz inline Jeśli masz na myśli i bądź konsekwentny. To sprawia, że myślisz mniej o tym, czy chcesz, czy nie, tylko dlatego, że możesz. (Zasada ta jest zgodny z Vandevoorde's / Josuttis' s C++ Template: The Complete Guide).

 74
Author: Sebastian Mach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-10 15:21:44

To nieistotne. Wszystkie szablony są już inline - nie wspominając już o tym, że od 2012 roku jedynym zastosowaniem słowa kluczowego inline jest zaprzestanie kompilatorów narzekających na naruszenia ODR. Masz absolutną rację-Twój kompilator obecnej generacji będzie wiedział, co zrobić samodzielnie i prawdopodobnie może to zrobić nawet między jednostkami tłumaczeniowymi.

 21
Author: Puppy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-10 14:23:16

Jak zasugerowałeś, {[0] } jest podpowiedzią dla kompilatora i nic więcej. Może wybrać, aby go zignorować lub, rzeczywiście, do funkcji inline Nie oznaczone inline.

Używanie inline z szablonami było (słabym) sposobem na obejście problemu, że każda jednostka kompilacji tworzy osobny obiekt dla tej samej klasy szablonów, co powodowałoby problemy z duplikacją w czasie łącza. Używając inline (chyba) nazwa działa inaczej, co w czasie linkowania obraca się wokół nazwy, ale kosztem ogromnie nadętego kodu.  

Marshall Cline wyjaśnia to lepiej niż ja.
 0
Author: Component 10,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-20 20:48:25