functii inline

Intrebari despre limbajul C++, standardul C++, STL, OOP in C++ sau alte subiecte nelegate de VisualC++
Post Reply
danna
Membru
Membru
Posts: 62
Joined: 25 Jul 2007, 10:02

functii inline

Post by danna » 30 Sep 2008, 09:23

Sa zicem ca am o functie inline. Care din abordarile de mai jos e cea mai buna, si de ce?

1. in declaratia clasei

Code: Select all

class foo
{
  int data;

public:
  int GetData() const {return data;}
};
2. in header

Code: Select all

class foo
{
  int data;

public:
  int GetData() const;
};

int foo::GetData() const {return data;}
3. in header + cpp.

Code: Select all

// heeder
class foo
{
  int data;

public:
  int GetData() const;
};

// cpp
#include "foo.h"
int foo::GetData() const {return data;}



User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: functii inline

Post by Silviu Ardelean » 30 Sep 2008, 09:32

Doar prima ta varianta este inline. ;)
Dupa parerea mea varianta 2 e un exemplu de cum nu se scrie cod, iar la varianta 3 nu inseamna ca metoda int GetData() const; e inline. Daca ai fi pus inaintea ei inline era altceva.

Code: Select all

inline int foo::GetData() const 
{
    return data;
}

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: functii inline

Post by Viorel » 30 Sep 2008, 11:22

Şi varianta 2 poate fi acceptată dacă se adaugă cuvîntul inline în implementarea funcţiei. Dacă se urmăreşte separarea implementării de declaraţie, atunci implementarea funcţiilor inline ar putea fi mutată într-un fişier separat avînd extensia INL, iar fişierul H din varianta 2 ar include o linie ca #include "Foo.inl". Asta se foloseşte în MFC şi cred că e o abordare bună.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: functii inline

Post by Silviu Ardelean » 30 Sep 2008, 12:07

In cazul 2 se specifica implementarea in afara clasei, dar in fisierul .h. Exemplu dat cu fisierul .INL, e cu totul altceva...

danna
Membru
Membru
Posts: 62
Joined: 25 Jul 2007, 10:02

Re: functii inline

Post by danna » 30 Sep 2008, 12:45

Da, am uitat sa specific inline, dar asta voiam.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: functii inline

Post by Marius Bancila » 30 Sep 2008, 16:17

Well, treaba e mai complicata, pt. ca si atunci cand specifici inline, s-ar putea ca functia sa nu fie inline, pt. ca ultimul cuvant il are compilatorul. Chiar si daca folosesti __forceinline, care e specific VC++, nu ai garantia ca va fi totusi inline.

Eu personal prefer varianta 1., pt. ca e cea mai simpla.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: functii inline

Post by Silviu Ardelean » 30 Sep 2008, 16:27

De acord cu argumentele tale Marius. Si eu prefer varianta 1.
Ar mai fi de mentionat faptul ca astfel de functii e bine sa aibe un corp relativ mic (de cateva linii), pentru ca, codul functiei se va insera in corpul fiecarei instante, a respectivei clase.
Daca exista multe, astfel de instante, se castiga viteza cu pretul memoriei consumate, in plus.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: functii inline

Post by Viorel » 30 Sep 2008, 17:17

Iar atunci cînd funcţiile inline simple mai conţin construcţii auxiliare de depanare de tipul assert sau ENSURE, ori blocuri sofisticate #ifdef, atunci probabil ar avea şi sens mutarea lor într-un loc sau fişier separat, pentru a simplifica declaraţia clasei.

Şi cazul claselor generice ar putea fi luat în discuţie.

danna
Membru
Membru
Posts: 62
Joined: 25 Jul 2007, 10:02

Re: functii inline

Post by danna » 30 Sep 2008, 17:26

Am inteles. Mersi pt. raspunsuri.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: functii inline

Post by Silviu Ardelean » 30 Sep 2008, 17:29

Viorel wrote:Iar atunci cînd funcţiile inline simple mai conţin construcţii auxiliare de depanare de tipul assert sau ENSURE, ori blocuri sofisticate #ifdef, atunci probabil ar avea şi sens mutarea lor într-un loc sau fişier separat, pentru a simplifica declaraţia clasei.
Viorel, scuze, dar nu inteleg motivul pentru care ai face o astfel de functie inline.

Viorel
Microsoft MVP
Microsoft MVP
Posts: 293
Joined: 13 Jul 2007, 12:26

Re: functii inline

Post by Viorel » 30 Sep 2008, 17:38

Silviu Ardelean wrote:Viorel, scuze, dar nu inteleg motivul pentru care ai face o astfel de functie inline.
Cred că nu doar funcţiile scurte pot fi făcute inline, dar şi cele care devin mici după interpretarea construcţiilor assert (eliminate în modul Release) sau #if. Importată este mărimea compilată, nu complexitatea sursei.

User avatar
Silviu Ardelean
Senior
Senior
Posts: 1175
Joined: 12 Jul 2007, 09:22
Judet: Timiş
Location: Timisoara
Contact:

Re: functii inline

Post by Silviu Ardelean » 30 Sep 2008, 17:44

De acord. Nu ma refeream la complexitatea codului, ci la la marimea instantelor rezultate in urma executiei codului. Specificasem si motivul pentru care e bine ca aceste metode inline sa nu mareasca exagerat obiectele.

to_be_defined
Junior
Junior
Posts: 3
Joined: 25 Jun 2008, 18:14

Re: functii inline

Post by to_be_defined » 06 Oct 2008, 14:24

danna wrote:Am inteles. Mersi pt. raspunsuri.
Nu stiu ce ai inteles, pentru ca nu ti-a raspuns nimeni la intrebare... Niciuna din variante nu este "mai buna", fiecare are avantaje si dezavantaje.

- Prima poate fi folosita pentru functii foarte scurte (return X;), pentru ca altfel aglomereaza codul declaratiei clasei.
- A doua poate fi folosita si pentru functii mai lungi, fiind definita in afara clasei.
- A treia poate fi folosita daca vrei ca functia ta sa fie inline doar in fisierul .CPP in care este definita* si sa fie apelata normal in celelalte locuri.

Note:
1. O functie merita sa fie declarata inline cand costul apelului este suficient de mare fata de costul executiei codului din interiorul functiei. Nu are legatura cu numarul de linii de cod din functie.
2. Dupa cum s-a mai spus, nu poti avea certitudinea ca o functie va fi facuta inline de catre compilator daca este declarata inline. Fisierele de ajutor specifice fiecarui compilator iti pot oferi mai multe informatii.


* Pentru a face o functie inline, compilatorul trebuie sa-i vada definitia, de aceea se definesc de obicei functiile membru inline in fisiere antet.

Post Reply