Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

1

11.11.2012, 12:52

Speichernutzung C++

Morgen,

Auch wenn ich kein riesiges Spiel entwickle, will ich trotzdem dafür sorgen, dass zur Laufzeit relativ wenig Speicher benutzt wird.

Ist es besser mit "&" zu programmieren oder mit "*", wo genau liegt der Unterschied?!?

zB

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void function1(int *zahl1)
{
    std::cout << *zahl1 << std::endl;
}
void function2(int &zahl2)
{
    std::cout << zahl2 << std::endl;
}
int main()
{
    int var1 = 1,var2 = 2;

    function1(&var1);
    function2(var2);

    std::cin.get();

    return 0;
}


Ich weiss, dass das Programm(wen man es so nenn darf) wenig Sinn ergibt, aber welche Funktion ist die bessere? Sind sie vielleicht gleich gut? Denke ich grade mal wieder zu dumm?!? :hmm:

Grüsse,
ERROR

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

2

11.11.2012, 13:13

Performance: beide exakt gleich. In diesem simplen Fall.
Speicherbedarf: beide exakt gleich.
Programmierstil: besser per Referenz als per Zeiger, weil Zeiger null sein können oder auf Müll zeigen können, während man bei Referenzen vom Compiler vor dem gröbsten Dummheiten bewahrt wird.

Einen Zeiger als Parametertyp nutzt Du, wenn:

- das übergebene Objekt per new allokiert wurde, also selbst als Zeiger vorliegt
- der Parameter optional ist und es keinen sinnvollen Ungültig-Wert gibt, an dem man ihn sonst erkennen könnte

Das ist also sehr selten. Eine Referenz benutzt Du:

- wenn das Objekt zu teuer zu kopieren ist. In dem Fall unbedingt als konstante Referenz
- wenn du Änderungen am Objekt vornehmen willst, die außerhalb der Funktion wirksam sein sollen

Das ist häufig der Fall. Tatsächlich ist sogar Parameter per const reference der Standardfall. Als Kopie übergibst Du Parameter nur, wenn:

- Du eine Kopie brauchst
- Move Semantics ausnutzen willst
- die Parametertyp was sehr schlichtes ist, z.b. int, float, size_t
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

ERROR

Alter Hase

  • »ERROR« ist der Autor dieses Themas

Beiträge: 417

Wohnort: Paderborn

Beruf: Informatik Student

  • Private Nachricht senden

3

11.11.2012, 13:18

Danke für die schnelle Antwort ;)

Zitat

In diesem simplen Fall.
Angenommen ich würde ein viel viel grössere Programm schreiben, gäbe es denn unterschiede?

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

4

11.11.2012, 14:18

- das übergebene Objekt per new allokiert wurde, also selbst als Zeiger vorliegt

Das kann der Autor der Funktion doch garnicht wissen.

Zitat

Angenommen ich würde ein viel viel grössere Programm schreiben, gäbe es denn unterschiede?

Nein. Wenn man von der unterschiedlichen Syntax absieht, sind Zeiger und Referenzen das selbe.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

11.11.2012, 15:57

Sie sind intern vielleicht dasselbe, sie verhalten sich jedoch komplett unterschiedlich, wie Schrompf schon erklärt hat.
Ein "delete" z.B. auf eine Variable, welche per "&x" übergeben wurde, ist eine reichlich dumme Idee. Auf einen echten per "new" angeforderten Pointer ist das aber kein Problem.
Referenzen und Pointer sind somit semantisch sehr verschieden und keineswegs dasselbe, NachoMan.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

6

11.11.2012, 16:21

Du beschreibst aber nicht den Unterschied zwischen einer Referenz und einem Zeiger, sondern eher zwischen einer "normalen Variable" und einem Zeiger, den man vom new-operator bekommen hat.
Immerhin kann man mit new erzeugte Objekte ebenfalls als Referenz übergeben und der Autor der Funktion kann es nicht von einem "normalen Object" unterscheiden.

Das einzige was ein Funktionsautor machen kann, ist zu definieren, dass dieses Objekt nur von dieser Funktion (bzw. seiner Klasse) freigegeben werden darf, weil das Objekt in seinen "Besitz" über geht.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

11.11.2012, 16:58

Wenn sie beide ein und dasselbe sind, hast Du Dich dann schon mal gefragt warum es überhaupt beides gibt? Eben genau deswegen, weil sie semantisch verschieden sind. Nur für eine andere Syntax hat man sie nämlich nicht eingeführt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

11.11.2012, 17:01

Wenn Zeiger und Referenzen das selbe sind, wie kann ich dann das Objekt, auf welches eine Referenz "zeigt" ändern?

Btw: Ich hätte gerne einen Zeiger auf eine Referenz bzw. eine Referenz auf eine Referenz. Wie das mit Zeigern geht, weiß ich, aber wie mach ich das mit einer Referenz?

Oh und noch etwas: Ich wollte vorhin einen std::vector aus Referenzen auf Integer erstellen, aber irgendwie will mein Compiler das nicht kompilieren... :S

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

9

11.11.2012, 17:20

Ich glaub wir reden aneinander vorbei.
Ich wollte damit sagen, dass es für das Programm zur Laufzeit keinen Unterschied gibt und die Syntax der Zeiger dem Programmierer ermöglicht ihn nachträglich auf etwas anderes (oder auf nichts) Zeigen zu lassen. Dadurch ergeben sich natürlich unterschiedliche Anwendungsgebiete.
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

11.11.2012, 17:22

Das würd ich aber eben so nicht sagen. Zeiger und Referenzen sind vielleicht ähnlich aber dann doch wieder grundverschieden und es wäre falsch zu glauben, dass Referenzen einfach zu Zeigern kompilieren. Das ist vielleicht unter gewissen Umständen der Fall, dann aber eben auch wieder nicht. Das fängt z.B. schon bei der Tatsache an, dass es undefiniert ist, ob eine Referenz überhaupt ein eigenständiges Objekt ist. Wenn der Compiler eine Funktion inlined, gibt es z.B. wohl keinen Grund, Referenzen in Zeiger aufzulösen...

Werbeanzeige