Horst_H hat folgendes geschrieben : |
const sowie var vor einem Parameter, sorgen für die Übergabe eines Pointers auf die Daten. |
Nur bei komplexeren Datentypen. Ein Wert wie ein Integer, der in ein Register passt, wird bei const auch als solcher übergeben. Das lässt sich auch leicht zeigen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| procedure Test1(const A: Integer); begin end; procedure Test2(var A: Integer); begin end; procedure Test3(A: Integer); begin end; procedure Test; var a: Integer; begin a := 3; Test1(a); Test2(a); Test3(a); end; |
Daraus wird:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Unit37.pas.32: a := 3; 005B469C C745FC03000000 mov [ebp-$04],$00000003 Unit37.pas.33: Test1(a); 005B46A3 8B45FC mov eax,[ebp-$04] 005B46A6 E8C9FFFFFF call Test1 Unit37.pas.34: Test2(a); 005B46AB 8D45FC lea eax,[ebp-$04] 005B46AE E8CDFFFFFF call Test2 Unit37.pas.35: Test3(a); 005B46B3 8B45FC mov eax,[ebp-$04] 005B46B6 E8D1FFFFFF call Test3 Unit37.pas.36: end; 005B46BB 59 pop ecx |
Horst_H hat folgendes geschrieben : |
Bei const meckert der Compiler aber bei Zuweisungen auf diesen Parameter.( rechts vom ":=" )
Es ist also sinnig, wenn man sicherer ( sicher ist man nicht immer ) vor nicht beabsichtigten Veränderungen sein will. |
Wobei man dazu sagen sollte, dass diese Zuweisungen nur innerhalb der aufgerufenen Methode sichtbar sind. Sprich es wird nicht der ursprüngliche Wert verändert. Bei einem Pointer kann man aber natürlich auch die Werte dahinter verändern, aber dagegen hilft const auch nicht.
Heißt:
Bei einfachen Datentypen, auch bei Pointern, bringt const keinen echten Unterschied. Man verhindert damit aber, dass jemand versehentlich einen Parameter in der aufgerufenen Methode verändert und dadurch unsauberer Code entsteht. Deshalb macht es durchaus Sinn const generell zu verwenden.
Bei strukturierten Datentypen und z.B. Strings kommt wie schon erwähnt dazu, dass der Compiler den generierten Code optimieren kann, da er weiß, dass in der aufgerufenen Methode keine Änderungen stattfinden und daher keine Kopie benötigt wird.
Es gibt also keinen echten Nachteil, aber teils deutliche Vorteile.