2011-10-18 11 views
6

Zgodnie ze standardem zewnętrzne funkcje inline muszą mieć ten sam adres we wszystkich jednostkach tłumaczeniowych.Zewnętrzne funkcje inline muszą mieć ten sam adres we wszystkich jednostkach tłumaczeniowych. Jak, do cholery, udało się to osiągnąć?

Jak to osiągnąć w kompilatorze? Mam na myśli, że kiedy kompiluję jakąś jednostkę tłumaczeniową, nie mam pojęcia, jak będzie wyglądała druga TU. Jak więc mogę wszędzie mieć ten sam adres?

Odpowiedz

6

To zależy od implementacji, ale zazwyczaj jest rozwiązane przez linker. Każda skompilowana jednostka tłumaczeniowa wytworzy plik obiektowy zawierający kopię funkcji, oznaczoną w pewien sposób, tak aby linker wiedział, że powinien oczekiwać (i zaakceptować) duplikaty. Łącznik będzie zawierał jeden z nich, odrzuci pozostałe i rozwiąże wszelkie odniesienia do funkcji.

+0

Co z bibliotekami? Czy mogę iść daleko? –

+0

Nieważne, właśnie sobie uświadomiłem, że nie ma różnicy :) –

+0

@Let_Me_Be: Biblioteki statyczne są zazwyczaj zbiorem plików obiektowych, a więc prawdopodobnie będą zawierały wiele kopii funkcji, które zostaną później rozwiązane podczas łączenia z programem. Biblioteki współdzielone są zwykle połączone jak program, dzięki czemu można w ten sposób wyeliminować wiele kopii. –

4

Prosta strategia: za każdym razem, gdy zdefiniowana jest taka funkcja inline, skompiluj ją do czasu obiektu, tak jakby była to normalna funkcja. Następnie, w czasie połączenia, wykryj duplikaty funkcji i usuń je, pozostawiając jedną kopię każdego z nich. W ten sposób około 10 lat temu pracowały kompilatory C++ (także w obliczu szablonów). Nie wiem, jak oni to robią w dzisiejszych czasach.