2015-03-09 17 views
17

Jeśli masz metodę i chcesz dać kompilatorowi wskazówkę, że warto ją wstawić, masz obecnie dwa rozwiązania. Pierwszym z nich jest zdefiniowanie metod, gdy deklarują swoją klasę:Metoda wewnętrzna: definicja klasy wewnętrznej i zewnętrznej

class Vector { 
private: 
    double* data_; 
    double* size_; 
    double* capacity_; 
public: 
    double& operator[](int k) { 
     return data_[k]; 
    } 
    ... 
} 

Ponieważ metoda ta może zmniejszyć czytelność, innym rozwiązaniem jest użycie słowa kluczowego inline i zdefiniować metodę Spośród zajęć:

class Vector { 
private: 
    double* data_; 
    double* size_; 
    double* capacity_; 
public: 
    inline double& operator[](int k); 
    ... 
} 

double& Vector::operator[](int k) { 
    return data_[k]; 
} 

Dzięki temu kod jest bardziej czytelny (przynajmniej ja go lubię). Czytając moją implementację STL, stwierdziłem, że używają one kombinacji dwóch. Niektóre metody (te, o których myślę, że powinny być rzeczywiście inline) są zdefiniowane w klasie, a inne są zdefiniowane poza klasą za pomocą wbudowanego słowa kluczowego. Plik rozpoczyna się także od skomentowanej deklaracji klasy.

Moje pytanie jest następujące. Czy obecne kompilatory (myślę o GCC, Clang, Intel i Visual Studio) są bardziej skłonne do wstawiania funkcji składowej, która jest zadeklarowana w klasie, niż funkcja składowa zadeklarowana poza klasą ze słowem kluczowym inline?

Uwaga: to pytanie nie jest duplikatem When should I write the keyword 'inline' for a function/method?, ponieważ moje pytanie dotyczy implementacji kompilatora. Czy te dwa sposoby powiedzenia, że ​​funkcje te mają być inklinowane, są równoważne. Sposób, w jaki napisano STL sugeruje, że tak nie jest.

+0

Prawdopodobny duplikat http://stackoverflow.com/questions/1759300/when-should-i-write-the-keyword-inline-for-a-function-method – dhke

Odpowiedz

1

Metody zdefiniowane w definicji klasy to domyślnie inline. Wybór jednego lub drugiego jest co najwyżej niewielkim utrudnieniem dla kompilatora, jeśli chodzi o optymalizację - najprawdopodobniej nie będzie to miało znaczenia, które wybierzesz.

12

inline kluczowe jest uważany za wskazówkę do kompilatorów, jednak większość kompilatorów są znacznie lepsze w podejmowaniu decyzji co do inline niż programistów więc one zwykle ignorują ten podpowiedź.

Główne (tylko?) Użycie dla słowa kluczowego inline w dzisiejszych czasach, aby umożliwić zdefiniowanie funkcji w nagłówku i nie generować błędów łącza wielokrotnej definicji (co nie ma nic wspólnego z rzeczywistym wstawianiem).

Również należy pamiętać, że inline dzieje w funkcja połączeń miejscu, więc nie ma sensu mówić funkcja jest inlined gdyż może on być wstawiane w niektórych miejscach, aw innych nie (w zależności od kodu wokół to).

Moja rada: użyj tego, co uważasz za bardziej czytelne, ponieważ nie będzie miało żadnego wpływu na faktyczne wstawianie (chyba że używasz czegoś specyficznego dla kompilatora, takiego jak __forceinline (nie rób tego)).

+1

Dzięki za wskazanie faktu, że funkcja jest nie podkreślono. Wywołanie funkcji jest funkcją inline. Ale inline słowa kluczowego w C++ jest dość dobre w wymuszaniu tego zamieszania. – InsideLoop

+0

Dzięki za podpowiedź na temat korzystania z wbudowanych, które nie dają błędów łącza wielokrotnej definicji. Ale nadal nie wyjaśnia, dlaczego implementatory STL nadal używają inline w klasach szablonowych. – InsideLoop

+2

Metody szablonów muszą być widoczne w punkcie użycia/tworzenia instancji, co oznacza umieszczanie ich w nagłówku. Tak więc wybór jest po prostu pomiędzy zdefiniowaniem metody dosłownie inline w twojej klasie lub dostarczeniem deklaracji "inline" i zdefiniowaniem jej później (ale wciąż w nagłówku). Jest to wybór stylistyczny i nie ma nic wspólnego z pytaniem o prawdopodobieństwo umieszczenia na stronach z ogłoszeniami. – Useless

5

Czy aktualnych kompilatorów (myślę o GCC, brzękiem, Intel, Visual Studio) są bardziej narażone na inline funkcji składowej, która jest zadeklarowana wewnątrz klasy niż funkcji członka zadeklarowana z klasy ze słowem kluczowym inline?

Nie ma absolutnie żadnej różnicy.

Jak zauważyli inni, w nowoczesnym kompilatorze inline jest niewiele więcej niż modyfikatorem połączenia. Faktyczne wstawianie jest kontrolowane przez flagi optymalizacji, wymagania dotyczące powiązań i atrybuty specyficzne dla kompilatora.

+0

Czuję, że nowoczesne kompilatory go ignorują. Ale dlaczego biblioteka libC++ ma _LIBCPP_INLINE_VISIBILITY, definiuje jakąś metodę w klasie i inne poza klasą? To wydaje się być bardzo skomplikowanym sposobem robienia rzeczy. – InsideLoop

+1

@InsideLoop - Wynika to z konieczności dostosowania widoczności ELF inline podczas budowania libC++ jako DSO, aby nie kończyły się definicjami z różnych współdzielonych obiektów, które używają sprzeczania się bibliotek libC++ w środowisku wykonawczym. – LThode

+0

@ThThode: Thanks for your info. – InsideLoop

Powiązane problemy