Struktury i C++
Zwracanie struktury przez wartość vs. przez wskaźnik

Porównajmy dwa sposoby inicjowania struktury

typedef struct {
  int a;
  int b;
  char c;
  double d;
  double e;
} Dane;
Dane init(){
  Dane d;
  d.a = 1;
  d.b = 2;
  d.c = A;
  d.d = 1.244;
  d.e = 2.345;
  return d;
}
int main(){
   Dane d = init();
   return 0;
}
void init(Dane * d){
  d->a = 1;
  d->b = 2;
  d->c = 'A';
  d->d = 1.244;
  d->e = 2.345;
}
int main(){
   Dane d;
   init(&d);
   return 0;
}

Niebezpieczeństwo w pierwszym kodzie polega na tym, że pomimo iż do funkcji jest przekazywany adres struktury d, to w funkcji zostanie utworzony lokalny obiekt i na końcu funkcji będzie potrzebne skopiowanie go.
W C++ nie mamy w funkcji init jawnego dostępu do obiektu w którym zwracamy wartość.

Obecne kompilatory potrafią wygenerować wydajny kod nawet bez optymalizacji.

Pierwszy program
Kod asemblerowy wygenerowany przez gcc

Drugi program
Kod asemblerowy wygenerowany przez gcc


Tomasz Kapela, Kraków 2011-2020