Hallo!
Ich hab jetz schon länger recherchiert, bin aber auf keinen grünen Zweig
gekommen. Deswegen stelle ich hier mal eine grundlegende C-Frage:
Was genau ist der UNterschied zwischen einer const Deklaration und einer
static const Deklaration?
Angenommen, ich definiere folgende Variablen innerhalb einer Funktion:
1
voidblabla()
2
{
3
constinta=10;
4
staticconstintb=10;
5
6
}
Ich habe das so verstanden:
const bedeutet, dass die Variable nicht verändert werden darf, d.h. es
ist nur ein lesezugriff erlaubt und der Wert bleibt über die gesamte
Lebensdauer konstant. Die variable a lebt also nur innerhalb von der
Funktion blabla und kann nicht verändert werden.
static const bedeutet das gleiche wie const mit dem Zusatz, dass die
Variable ihre Lifetime mit Ende der Funktion nicht beednet hat, d.h. der
Speicher dieser Variable b wird nicht mit Ende der Funktion freigegeben.
Ist das so korrekt?
Wenn ja, dann verstehe ich folgendes nicht:
Wozu die static deklaration bei variable b, wenn ich sie eh nicht
verändern darf? Für mich macht static nur sinn, wenn ich die Variable
verändern darf (z.B. mit jedem Funktionsaufruf um 1 erhöhe). Aber ich
sehe keinen Sinn dahinter, static mit const zu kombinieren. Kann mir
jemand weiterhelfen??
Vielen Dank!
Werner Weinwurm schrieb:> static const bedeutet das gleiche wie const mit dem Zusatz, dass die> Variable ihre Lifetime mit Ende der Funktion nicht beednet hat, d.h. der> Speicher dieser Variable b wird nicht mit Ende der Funktion freigegeben.>> Ist das so korrekt?
Ja.
Werner Weinwurm schrieb:> Wozu die static deklaration bei variable b, wenn ich sie eh nicht> verändern darf?
Auch wenn es eher hypothetischer Natur ist: du könntest mit viel Gewalt
oder einem Zeiger das "const" weg-casten, um die Variable zu verändern.
Wenn du die Funktion dann erneut aufrufst, sollte in b der veränderte
Wert drin stehen. Zumindest ist das meine Vermutung. Verwendest du
ausschließlich const, ist die Variable beim erneuten Funktionsaufruf
definitiv zurückgesetzt. Es kann aber sein, dass ich mit dieser
Vermutung auch falsch bin.
Werner Weinwurm schrieb:> Ist das so korrekt?
Im Prinzip ja.
Wobei du dir hier ein Beispiel heraus gesucht hast, dass in sich ein
wenig unsinnig ist.
Denn dadurch, dass die Variable als const markiert wurde, hast du den
Compiler die Zusicherung gegeben, dass sich ihr Wert niemals mehr ändern
wird. Eine Variable, deren Wert sich aber niemals mehr ändert, braucht
aber tatsächlich niemand als eigenständige Variable. Der Compiler kennt
an dieser Stelle den Wert und kann diesen Wert überall im Scope dieser
const-Variablen direkt benutzen. Womit die Notwendigkeit, dafür SPeicher
zu reservieren unter Umständen komplett wegfällt.
> Wenn ja, dann verstehe ich folgendes nicht:> Wozu die static deklaration bei variable b, wenn ich sie eh nicht> verändern darf?
Sieh es so an.
Dieses static ist nur deshalb hier, weil der Normalfall darin besteht,
dass eine derartige Variable nicht const ist.
Da jetzt eine zusätzlichen Fehlerfall zu konstruieren wäre zusätzlicher
Aufwand, den Compiler testen müssten. Aber eigentlich ... wäre die
Kombination aus static und const an dieser Stelle ein "Fehler", der
niemanden wirklich juckt.
Etwas anderes wäre es bei einem static const auf File-Ebene. Da macht
das static nämlich wieder Sinn, weil es den Sichtbarkeitsbereich des
const auf das File eingeschränkt, und damit der Compiler ganz sicher
weiß, dass sich kein anderes c-File auf diese const-Variable extern
referenzieren kann.
> du könntest mit viel Gewalt oder einem Zeiger das "const" weg-casten, um die
Variable zu verändern.
In dem Moment hast du undefiniertes Verhalten. Alles kann passieren und
es gibt keine Garantie für irgendwas.
Hmm, danke für die ANtworten.
Richtig schlau bin ich daraus allerdings nicht geworden :/
Kann ich es so abschließen: ich kann/soll einfach immer static const
verwenden?
LG
Werner Weinwurm schrieb:> Hmm, danke für die ANtworten.>> Richtig schlau bin ich daraus allerdings nicht geworden :/>> Kann ich es so abschließen: ich kann/soll einfach immer static const> verwenden?
Innerhalb einer Funktion hat es keinen Sinn, schadet aber auch nicht.
Wenn es dir Spass macht, dann schreibe static.
In deinem Beispiel macht das kein Unterschied, da die Variablen nicht
verwendet werden.
Falls sie jedoch Verwendung finden und nicht wegoptimiert werden,
erhälst du anderen Code. Einmal wird die Variable im Static Storage
abgelegt (z.B. in .rodata), im ersten Fall wird sie auf dem Stack
abgelegt.
Je nachdem, was du willst, verwendest du eben static oder nicht.
Versuch etwa folgenden Code und schau dir den erzeugten Assembler an:
Johann L. schrieb:> Je nachdem, was du willst, verwendest du eben static oder nicht.>> Versuch etwa folgenden Code und schau dir den erzeugten Assembler an:
und dann bitte den gelichen Versuch mit C++ ;-)))
Brater schrieb:> Werner Weinwurm schrieb:>> Wozu die static deklaration bei variable b, wenn ich sie eh nicht>> verändern darf?>> Auch wenn es eher hypothetischer Natur ist: du könntest mit viel Gewalt> oder einem Zeiger das "const" weg-casten, um die Variable zu verändern.> Wenn du die Funktion dann erneut aufrufst, sollte in b der veränderte> Wert drin stehen. Zumindest ist das meine Vermutung.
Das kann sein, muß aber nicht. Wenn die Variable const ist, heißt das
für den Compiler, daß er davon ausgehen darf, daß du sie nicht
veränderst, und basierend darauf wird er optimieren.