Cóż, najpierw zburzymy niektóre z twoich założeń:
- Jedną z zalet bibliotek tylko nagłówkowych dla C ++ jest to, że nie trzeba ich oddzielnie kompilować.
Kompilowanie osobno oznacza potencjalnie brak konieczności ponownej kompilacji wszystkiego, jeśli zmieni się tylko część.
Zatem wada zamiast przewagi.
- W C i C ++ wstawianie ma sens tylko wtedy, gdy funkcja jest zdefiniowana w pliku nagłówkowym *.
Tak, jedynym efektem, inline
jaki pozostał, jest wyjątek od reguły jednej definicji .
Biada wam, jeśli te definicje różnią się w jakikolwiek sposób.
Tak więc, jeśli funkcja jest wewnętrzną jednostką kompilacji, zaznacz ją static
. To sprawia, że wstawianie jest bardziej prawdopodobne, ponieważ funkcja musi być dostępna w celu jej wstawienia.
Mimo to spójrz na optymalizację czasu łącza, obsługiwaną co najmniej przez MSVC ++, gcc i clang.
- Tradycyjnie w C używany jest układ .c / .h, w którym nagłówek reprezentuje minimalny publiczny interfejs jednostki tłumaczeniowej. Podobnie .cpp / hpp.
Cóż, tylko przedstawienie minimalnego interfejsu jest z pewnością jednym z celów, aby osiągnąć wyższą stabilność API i ABI oraz zminimalizować czas kompilacji.
Zwłaszcza klasy C ++ nie są do tego specjalnie dostosowane, ponieważ wszystkie prywatne bity przeciekają do nagłówka, podobnie jak chronione, czy chcesz z nich czerpać, czy nie.
Wzorzec projektowy PIMPL służy do zmniejszenia takich szczegółów.
Jednak częścią, w której interfejs i implementacja całkowicie nie działają w C ++, są szablony.
Komitet próbował zrobić coś z wyeksportowanymi szablonami , ale zostało to porzucone jako zbyt skomplikowane i tak naprawdę nie działające.
Teraz pracują nad odpowiednim systemem modułów , choć działa powoli. To znacznie skraca czas kompilacji, a także powinno zwiększyć stabilność API i ABI poprzez zmniejszenie ich powierzchni.
Czy biblioteki zawierające tylko nagłówki są generalnie bardziej wydajne pod względem kodu i czasu wykonania niż tradycyjny układ? Jeśli tak, to czy wynika to z dużej inlinizacji lub innych optymalizacji?
Biblioteki zawierające tylko nagłówki mogą być bardziej wydajne pod względem rozmiaru kodu i czasu wykonywania, choć zależy to od tego, czy biblioteka jest współużytkowana, ile z niej jest wykorzystywana, w jaki sposób i czy inlining stanowi decydującą wygraną w tym konkretnym przypadku.
Powodem, dla którego wstawianie jest tak ważne dla optymalizacji, nie jest to, że wkładanie samo w sobie jest tak świetnym wzmocnieniem, ale ze względu na możliwości ciągłej propagacji i dalszej optymalizacji, otwiera się.