static const

OP #2255449
Lesenswert?

Hallo,

ich habe eine Frage zur Deklaration eines Feldes. Was bedeutet es, wenn 
ich ein Feld innerhalb einer Funktion mit "static const" deklariere?

Bsp:

void foo(void)
{
   static const char var[4] = {0xFF,0xFF,0xFF,0xFF};
}



Trifft denn folgende Aussage zu, auch wenn ich das Ganze auf einem µC 
programmiere?

http://www.gamedev.net/topic/553167-static-const-vs-const-in-function-scope/
#2255454
Lesenswert?

Welche Aussage in dem verlinkten Thread? Dass der Computer piepst und 
dann Feuer fängt?

Was spricht dagegen, den Codeschnippsel einfach durch deinen Compiler 
mit deinen Optimierungseinstellungen zu jagen, und sich den 
generierten ASM-Code anzusehen?

Der Compiler hat da recht viele Freiheiten, was er wie optimieren darf. 
Welche er wählt, hängt von zu vielem drumherum ab, um da jetzt eine 
generelle Aussage treffen zu können.
Gast #2255502
Lesenswert?

Εrnst B✶ schrieb:
> Der Compiler hat da recht viele Freiheiten

Hat er nicht. Er sollte zunächts mal genau das tun, was der C-Standard 
für diesesn Fall definiert. Nur innerhalb dieser Grenzen hat er dann 
Freiheiten.

Also sollte man im C-Standard (oder in einen einigermassen brauchbaren 
C-Buch) einfach mal nachlesen.

Oliver
#2255557
Lesenswert?

Oliver schrieb:
> Hat er nicht

Hat er schon.
z.B. kann er die Variable ganz weglassen, wird ja nirgends drauf 
zugegriffen. Er könnte sie aber z.B. auch mehrfach anlegen, damit jeder 
CPU-Core seine eigene lokale Kopie im Cache hat, usw.

> Also sollte man im C-Standard ...

Der C-Standard schreibt nur vor, wie sich das Compilat nachher zu 
Verhalten hat, nicht auf welchem Weg der Compiler zu diesem Ergebnis 
kommt.
Gast #2255646
Lesenswert?

Εrnst B✶ schrieb:
> Der C-Standard schreibt nur vor, wie sich das Compilat nachher zu
> Verhalten hat, nicht auf welchem Weg der Compiler zu diesem Ergebnis
> kommt.

Richtig. Nur war die Frage des TO nicht "was macht der Compiler aus 
static const" (das ist nur das Thema im verlinkten Thread), sondern "was 
bedeutet static const". Und das steht im C-Standard.

Oliver
#2255691
Lesenswert?

Stefan Ernst schrieb:

> Wieso ist hier eigentlich ständig die Rede von C und C-Standard? Seine
> Frage bezog sich auf einen anderen Thread, und in dem geht es ganz klar
> um C++.

Wozu man da erst einmal reinsehen muss. Hier stehts jedenfalls nicht. 
Bei der Deklaration
  void foo(void)
springt der Gedanke an C++ auch nicht sofort ins Auge.

Abgesehen davon stimmt die Aussage bei C++ ebensowenig wie bei C.
#2255704
Lesenswert?

Stefan Ernst schrieb:
> Frage bezog sich auf einen anderen Thread,

Um den anderen Thread zu zitieren:

> Also not quite right. The results of modifying a variable originally
> declared as const are undefined. The computer could print 27; it could
> print 42; it could print -8.2; it could beep and then catch fire.

Dazu die Frage:

Philipp S. schrieb:
> Trifft denn folgende Aussage zu, auch wenn ich das Ganze auf einem µC
> programmiere?

Also die Antwort:

Nein, dein µC wird nicht Piepsen, dafür fehlt der Lautsprecher.


Alle Klarheiten beseitigt?
OP #2255781
Lesenswert?

Ok, vergessen wir doch das mit dem Link, den ich zur Verwirrung aller 
(inklusiver mir selbst) in meinem ersten Beitrag gepostet hab. Vielmehr 
interessiert doch die Frage, worin der Unterschied zu folgenden 
Deklarationen liegt:

(Alle seien innerhalb einer Funktion deklariert, also nicht global)

1.
1
static char var[4] = {0xFF,0xFF,0xFF,0xFF};
2.
1
const char var[4] = {0xFF,0xFF,0xFF,0xFF};
3.
1
static const char var[4] = {0xFF,0xFF,0xFF,0xFF};


Fall 1 und 2 sind wohl allen bekannt, aber wie sieht es mit dem dritten 
aus?
#2255792
Lesenswert?

Was soll damit sein?
Wegen static liegt das Feld statisch im Speicher, wird also nicht bei 
jedem Funktionsaufruf auf Stack angelegt.
Wegen const darfst du die Werte nicht ändern.

Was der Compiler daraus macht, ist dann seine Sache (z.B. könnte er
Zugriffe auf die Elemente durch Konstanten im Code ersetzen, muß es aber 
nicht).
#2255800
Lesenswert?

Εrnst B✶ schrieb:
> Fall 1: var liegt am Stack
> Fall 2+3: var liegt im Data.
> Fall 1+3: Compiler verbietet Änderungen an Var.

Muss natürlich
Fall 2: var liegt am Stack (const)
Fall 1+3: var liegt im Data. (static + const static)
Fall 2+3: Compiler verbietet Änderungen an Var. (const + const static)

heißen.

Nur falls das jemandem noch nicht aufgefallen ist...
Moderator #2256035
Lesenswert?

Philipp S. schrieb:
> 2.
> const char var[4] = {0xFF,0xFF,0xFF,0xFF};

Εrnst B✶ schrieb:
> Fall 2: var liegt am Stack (const)

GCC 4.2 hat die Variable noch ins Data gelegt, ab 4.3 kam sie dann auf
den Stack. Die beiden Varianten unterscheiden sich wegen dem const nicht
funktional, sondern nur im Speicherabbild. Trotzdem war wohl 4.2 nicht
ganz standardkonform, da lokale Variablen, die nicht mit static dekla-
riert werden, automatic storage duration haben müssen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren