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

simbad

unregistriert

11

13.04.2013, 08:51

Nochmal um das deutlich zu machen.

C-/C++-Quelltext

1
2
typirgendwas varirgendwas[wieviele]; // ist ein speicherbereich von 'wieviele' elemente 
typirgendwas *varwasanderes;   //  ist die adresse auf elemente.


Daraus folgt, das beim Zugriff auf die Inhalte unterschiedlicher Code erzeugt werden muss. Dabei spielt es keine Rolle, wie diese beiden Variablen initialisiert werden.
Der name der beiden Variablen ist aber in jedem Fall die Addresse auf den Speicherbereich.

C-/C++-Quelltext

1
2
printf("%s\n", varirgendwas);   // Hier wird die addresse an printf übergeben
printf("%s\n", varwasanderes);// Hier auch


Nur der Weg, wie diese addresse erzeugt wird ist Aufgrund der Natur der Variablen-Definition ein anderer. Bringt man das durcheinander, knallts.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

12

13.04.2013, 09:13

Das zweifle ich an.
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]

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

13

13.04.2013, 09:28

Erstmal habe ich dich nicht als Idiot bezeichnet.

Logisch dass du einen segfault bekommst, wenn du deine Variable mit einem anderen Typ definierst. Sollte eigentlich auch Warnings ergeben.

Es gibt dort aber trotzdem keine extra Indirektion. Wie ich ja schon geschrieben habe, so ist einer der Unterschiede zwischen text und moretext, das text konstant ist und moretext nicht. Daher greift fuer text immer die Optimierung fuer konstanten Werte. Bei moretext nur, wenn man Optimierungen aktiviert und der Compiler erkennt, das moretext konstant ist. Ist moretext allerdings nicht konstant, dann muss eine Speicheradresse angelegt werden, wo die Zahl aus moretext abgelegt wird. Diese Zahl kann dann irgendwo geaendert werden. Greift man dann auf moretext zu, so muss die Zahl gegebenenfalls auch wieder gelesen werden. Was aber mit einer Indirektion nichts zu tun hat, sondern damit das eine variable Zahl nun mal variabel ist und man sie deswegen aus dem Speicher lesen muss und nicht direkt in den Code schreiben kann. Das "movq text(%rip), %rax" ist genau der Befehl dazu. Ansonsten sieht das aber so aus: fuer alle Varianten genau gleich, nur das sich die Adresse des Speicherblocks aendert.

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
; 8    :    puts( text );

  00001 8b 35 00 00 00
    00       mov     esi, DWORD PTR __imp__puts


  00007 68 00 00 00 00   push    OFFSET ?text@@3PADA    ; text
  0000c ff d6        call    esi

; 9    : 
; 10   :    const char* text2= "Hallo";
; 11   :    puts( text2 );

  0000e 68 00 00 00 00   push    OFFSET ??_C@_05NLDMIFDH@Hallo?$AA@
  00013 ff d6        call    esi

; 12   : 
; 13   :    char* text3= "Hallo";
; 14   :    puts( text3 );

[b]  00015  68 00 00 00 00   push    OFFSET ??_C@_05NLDMIFDH@Hallo?$AA@
  0001a ff d6        call    esi[/b]

; 15   :    text3++;
; 16   :    puts( text3 );

  0001c 68 01 00 00 00   push    OFFSET ??_C@_05NLDMIFDH@Hallo?$AA@+1
  00021 ff d6        call    esi

simbad

unregistriert

14

13.04.2013, 09:33

Nun gut.
Dann werde ich einfach so weiter machen wie die letzten 30 Jahre C/C++ Programmierung und ihr werdet so weitermachen wie ihr das für richtig haltet.
Ich habe Beispiel Code geliefert, den kann man überall übersetzen und sich den Assembler Output anschauen.
Da kann sich dann jeder selbst ein Bild von machen.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

15

13.04.2013, 09:37

Dein Beispiel macht halt keinen Sinn, weil der Code falsch ist.

Daraus folgt, das beim Zugriff auf die Inhalte unterschiedlicher Code erzeugt werden muss.
Nein, es muss nicht. Aber der Compiler darf alles erzeugen was er will, er kann also sogar bei jeder erneuten Verwendung anderen Code erzeugen.

Dabei spielt es keine Rolle, wie diese beiden Variablen initialisiert werden.
Doch, und zwar die wesentliche! Der Inhalt bestimmt letztendlich ueber die Verwendung, nicht der Typ.

Der name der beiden Variablen ist aber in jedem Fall die Addresse auf den Speicherbereich.
Nein, ein Name ist keine Adresse. Diese Aussage macht keinen Sinn.

simbad

unregistriert

16

13.04.2013, 09:38

Der Compiler kann nicht warnen, wenn die Variable in einem anderen Modul anders importiert wird.
Dann kann auch kein Optimizer was erkennen.
Schalte mal den Optimizer ab. Dann sieht dein Code entschieden anders. aus.
Aber lassen wir das. Es ist ein sinnlose Diskussion.

simbad

unregistriert

17

13.04.2013, 10:23

Ja. Du hast recht.
Es ist alles Unsinn was ich erzählt habe.
Also ihr lieben Anfänger. Glaubt Ihm, nicht mir.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

18

13.04.2013, 11:29

Die Sache ist halt, dass TGGC Recht hat. Das hat auch nichts mit "Optimizer ausschalten" zu tun. Warum auch? Hängt die Korrektheit Deiner Aussage davon ab, ob der Optimizer eingeschaltet ist oder nicht? Denn falls ja, solltest Du die generelle Korrektheit Deiner Aussage grundlegend überdenken.

Vor allem stutzig hat mich aber gemacht, dass jemand mit 30 Jahre langer Erfahrung eine Aussage tätigt wie: "Der name der beiden Variablen ist aber in jedem Fall die Addresse auf den Speicherbereich.". Das ist einfach Unfug. Bei Assembler markiert ein Variablen-Name eine Adresse und wird behandelt wie ein Label, bei C/C++ ist ein Name einer Variable aber eben nur das: Ein Name. Der Compiler kann sich entscheiden das Ding komplett in Registern verschwinden zu lassen und spätestens da ist mit Adresse dann gar nichts mehr.
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]

simbad

unregistriert

19

13.04.2013, 11:41

Auch du hast recht. Und ich unrecht.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

20

13.04.2013, 12:01

Auch wenn das von Dir sehr sarkastisch klingt, ist es doch schön, dass Du es einsiehst.
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]

Werbeanzeige