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 .
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).
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.
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.
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