Forum: Mikrocontroller und Digitale Elektronik const int vs. static const int


von Werner W. (bj20)


Lesenswert?

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
void blabla()
2
{
3
    const int a = 10;
4
    static const int b = 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!

von Brater (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

> 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.

von Werner W. (bj20)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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:
1
extern void f (const int*);
2
3
void fa (void)
4
{
5
    const int a = 10;
6
    f (&a);
7
}
8
9
void fb (void)
10
{
11
    static const int b = 10;
12
    f (&b);
13
}

: Bearbeitet durch User
von versuch macht kluch (Gast)


Lesenswert?

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++   ;-)))

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Mein Beispiel lässt sich genauso als C++ übersetzen.

von versuch macht kluch (Gast)


Lesenswert?

Johann L. schrieb:
> Mein Beispiel lässt sich genauso als C++ übersetzen.

Natürlich, kommen denn auch die gleichen Maschinenbefehle raus?

von Fachmann (Gast)


Lesenswert?

Das beste Buch über C dass ich gelesen habe heisst Thinking in C++ .

http://mindview.net/Books/TICPP/ThinkingInCPP2e.html

Meine Empfehlung für alle.

von Rolf Magnus (Gast)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.