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?
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.
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.
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.
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:
1
typedefstruct
2
2{
3
3unsigneda;
4
4unsignedb;
5
5unsignedc;
6
6unsignedd;
7
7}TS;
8
8
9
9
10
10intfoo1(TSar[],unsignedindex)
11
11{
12
12returnar[index].d;
13
13}
14
14
15
15
16
16unsignedfoo2(unsignedar[],unsignedindex)
17
17{
18
18returnar[index*sizeof(TS)/sizeof(unsigned)+3];
19
19}
20
20
1
Ein alter 2008 cl macht draus:
2
3
cl -O1 -c test.c
4
dumpbin -disasm test.obj
5
6
Note: Das erste Argument (ar) ist im Register ecx,
🐧 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.
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.
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.
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.