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

1

28.07.2013, 20:11

Dynamisches array im Prozessor [C++]

Guten Abend :D
Es gibt ja die möglichkeit bei der Deklaration "register" vorzusetzen, sodass die Variable im Prozessor gespeichert wird.
Wie sieht es nun mit einem dynamischem Array aus, welches mit "new" gesetzt wird?
Ist dann nur der Zeiger im Prozessor gespeichert und der Wert auf dem Heap?
Oder ist alles im Prozessor? :D

Oberon

Treue Seele

Beiträge: 181

Wohnort: Österreich

Beruf: Student

  • Private Nachricht senden

2

28.07.2013, 20:22

register ist nur ein Hinweis an den Compiler, der heutzutage eigentlich von jedem Compiler ignoriert wird. Das Keyword (bzw. diese Bedeutung) ist sogar deprecated (C++11 Standard, D.2: "The use of the register keyword as a storage-class-specifier (7.1.1) is deprecated.")
Auf üblichen Architekturen ist ein Prozessorregister genauso groß wie ein Pointer, d.h. es könnte maximal ein Zeiger auf ein Array in einem Register gespeichert werden, und wenn du register vor eine Variablendeklaration mit Zeigertyp schreibst würdest du dem Compiler auch das empfehlen. Aber wie gesagt -- register ist (heutzutage) nutzlos -- vergiss es einfach.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

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

  • Private Nachricht senden

3

28.07.2013, 20:28

Noch eine Erklärung wieso es nichtmehr gebraucht wird: In den allermeisten Fällen optimiert ein moderner Compiler besser als ein guter Programmierer.
"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

4

28.07.2013, 22:37

RE: Dynamisches array im Prozessor [C++]

Um auch deine Frage zu beantworten:

Wie sieht es nun mit einem dynamischem Array aus, welches mit "new" gesetzt wird?
Ist dann nur der Zeiger im Prozessor gespeichert und der Wert auf dem Heap?
Oder ist alles im Prozessor? :D

Natürlich nur der Pointer, sofern möglich und sinnvoll. Und das würde der Compiler, wie bereits gesagt wurde, sowieso machen; jeder moderne Compiler ignoriert dieses Schlüsselwort völlig... ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »dot« (28.07.2013, 22:44)


Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

5

28.07.2013, 22:59

Wer dennoch meint, besser als der Compiler sein, kümmert sich via Assembly um die Register-Belegung. Theoretisch gesehen könnte es bei einem register float x[8]; dazu führen, dass das float-Array in einem YMM-Register landet. Die SIMD-Register sind allerdings so neu, dass "register" auch so etwas nicht beeinflussen wird, weil deprecated.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

28.07.2013, 23:07

Wer dennoch meint, besser als der Compiler sein, kümmert sich via Assembly um die Register-Belegung.

Und stört den Optimizer bei der Arbeit, sodass der Code dann effektiv langsamer wird... ;)

Theoretisch gesehen könnte es bei einem register float x[8]; dazu führen, dass das float-Array in einem YMM-Register landet.

Kann mir nicht vorstellen, dass irgendein Compiler das macht, wenn das Array mit new erzeugt wurde.

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

7

29.07.2013, 23:27

Zitat

Kann mir nicht vorstellen, dass irgendein Compiler das macht, wenn das Array mit new erzeugt wurde.
Nun, das Beispiel war statisch. D;

Zitat

Und stört den Optimizer bei der Arbeit, sodass der Code dann effektiv langsamer wird... ;)
Nun, hängt stark davon ab, wie der Compiler mit Black Box -Funktionen umgeht. Aber wer per Hand assembliert, der soll auch keine Nachbearbeitung des Assembly-Outputs scheuen.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Werbeanzeige