Gast
#7091762
Einen schönen guten morgen, ich habe mal eine interessensfrage. Auf was wird schneller zugegriffen, struktur oder array, oder macht der compiler eh das selbe daraus?
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
1 | |
2 | |
|
Anzeige
|
zugriff auf struktur oder array, was ist schneller?
Gast
#7091762
Einen schönen guten morgen, ich habe mal eine interessensfrage. Auf was wird schneller zugegriffen, struktur oder array, oder macht der compiler eh das selbe daraus?
Gast
#7091768
Hallo, teste es doch mit dem Compiler Explorer. https://godbolt.org/ Glaube nicht das es gleich ist.
Gast
#7091770
Macht in dem Fall genau das selbe draus: https://godbolt.org/z/qvExMK4eK Also, wenn mich die Frage interessieren würde, dann würde ich es herausfinden. Konkret in deinem Beispiel habe ich eine Vermutung. Um die zu belegen müsste man es kompilieren und im Code nachsehen. Kannst du aber bei Interesse wahrscheinlich auch selber. Nur du weißt, von welcher Umgebung du redest... Felix schrieb: > Auf was wird schneller zugegriffen, struktur oder array, oder macht der > compiler eh das selbe daraus? Solange du gleiche Datentypen innerhalb deines Array/Struct hast wird das immer auf eine Base Adresse+Offset rauslaufen. Sollte also gleich sein. Bei einem Array ist der gleiche Datentypen ja gesetzt. Bei einer Struct könntest du natürlich auch Datentypen mischen. Dann wird eine Struct mit Sicherheit höhere Kosten bzgl Laufzeit bedeuten. Gerade wenn die Plattform evtl. nur wenig spezielle Zugriffsbefehle unterstützt.
Gast
#7091779
N. M. schrieb: > Bei einer Struct > könntest du natürlich auch Datentypen mischen. Dann wird eine Struct mit > Sicherheit höhere Kosten bzgl Laufzeit bedeuten. Nö, ist immernoch ein konstanter Offset, der zur compile time bekannt ist. Der "use case" einer Struktur ist doch recht verschieden von dem eines Arrays. Was willst du erreichen, welches Problem lösen? N. M. schrieb: > Dann wird eine Struct mit > Sicherheit höhere Kosten bzgl Laufzeit bedeuten. Eher ist der Array-Zugriff langsamer, wenn der Index nicht zur Compile-Time bekannt ist, weil dann je nach Plattform (z.B. beim AVR) erst Basis+Offset berechnet werden muss. Leistungsfähigere Prozessoren (z.B. ARM) können das (meistens) direkt im Ladebefehl machen.
Gast
#7091814
Felix schrieb: > ich habe mal eine interessensfrage. > > Auf was wird schneller zugegriffen, struktur oder array, oder macht der > compiler eh das selbe daraus? Der Compiler macht meist das Gleiche draus. Für die Geschwindigkeit dürfte das aber nicht entscheidend sein, da die meisten Prozessoren heute parallel arbeiten, und den Assembler-Code sowieso umstellen. Interessanter wird es, wenn du ein Feld von Strukturen hast: da ist der Offset nicht konstant. Kleiner Test unter Windows 10 x64:
Ein 2022 cl liefert in beiden Fällen das Gleiche. Genauso ein neuer clang. gcc unter mingw macht irgendein komisches Padding dazu:
🐧 DPA 🐧 schrieb: > Nö, ist immernoch ein konstanter Offset, der zur compile time bekannt > ist. Ich meinte das bezogen auf das Alignement. Je nach dem gibt es da ja sehr ungünstige Konstellationen. Niklas G. schrieb: > Eher ist der Array-Zugriff langsamer, wenn der Index nicht zur > Compile-Time bekannt ist Ja klar. Wenn man testStruct_s.a; und testArray[i]; vergleicht muss natürlich beim Array der Offset zur Laufzeit berechnet werden. Der dynamische Zugriff fehlt ja beim struct. Von dem her ist der Vergleich etwas unfair. Man könnte natürlich noch eine Union um die Struct/Array legen. Dann hätte man beide Möglichkeiten.
Gast
#7091956
Evwntuell wären noch vor und nachteile von Arrays nach Komponente vs. nach Objelt interessant:
Gast
#7091961
Lars Hempel schrieb: > teste es doch mit dem Compiler Explorer Kommt es denn nicht drauf an auf welcher Architektur das Ganze laufen soll? Vielleicht solte der TO das noch angeben.
Gast
#7091967
Felix schrieb: > Auf was wird schneller zugegriffen, struktur oder array Als ein lokale Variable oder als Parameter einer Funktion? Übergabe an die Funktion per Pointer auch bei der Struktur? Das sind Äpfel undn Birnen.
Gast
#7092007
beo bachta schrieb: >> teste es doch mit dem Compiler Explorer > > Kommt es denn nicht drauf an auf welcher Architektur das > Ganze laufen soll? Vielleicht solte der TO das noch angeben. > Sicher, aber eine Architektur erwähnte der TO nicht beo bachta schrieb: > Kommt es denn nicht drauf an auf welcher Architektur das > Ganze laufen soll? Da die Frage im Unterforum "PC-Programmierung" gepostet wurde kann man erst mal von einem PC ausgehen. Und das macht die Frage eigentlich fast obsolet, denn moderne PCs haben soviel Rechenleistung dass sich solche Fragen zur Optimierung praktisch nie lohnen. Viel eher lohnen sich dann Überlegungen zur Softwarearchitektur, den verwendeten Algorithmen oder unterschiedlichen Speicherstrategien wie z.B. (sortierten) Listen, Bäume, Maps usw. Zumal Arrays und Strukturen eigentlich grundverschiedene Strukturen sind die beide ganz unterschiedliche Anwendungsszenarien haben. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|