C
hustbaer schrieb:
BorisDieKlinge schrieb:
wenn die variabel mit register deklariert ist, ist diese ja definitiv im CPU Register oder???
(...)
wenn ich nun den wert auf dem heap schreibe, dann ist der wert auch garantiert auf m speicher.
war nur so ne überlegeung.. wenn diese denkweise krottenfalsch ist, bitte nich aufregen *fg*
rofl
ganz falsch.
der compiler muss lediglich ein programm ausspucken dessen beobachtbares verhalten dem entspricht was das programm laut C++ standard tun müsste.
register und der speicher gelten dabei nicht als "beobachtbar".
ausgenommen eben variablen die man als "volatile" deklariert.
Nicht einmal diese Ausnahme gilt derart uneingeschränkt. Zunächst einmal beschreibt der Standard nur das Verhalten eines abstrakten Automaten, eine tatsächliche Implementation muss lediglich das (als beobachtbar definierte) Verhalten dieses Automaten emulieren. Wie diese Emulation aussehen muss, wird dabei aber nicht festgelegt. Zwar ist die Abfolge von Lese- und Schreibvorgängen auf volatile-Daten beobachtbar im abstrakten Automaten, dessen Emulation muss dagegen nicht unbedingt direkt an der realen Maschine beobachtbar sein.
z.B.:
int main()
{
srand(time(0));
int a = rand();
int b = rand();
volatile int va;
volatile int vb;
for ( int i = 0; i < a; ++i ) va = 0;
for ( int i = 0; i < b; ++i ) vb = 0;
}
Wenn wir dieses einfache Programm auf einer realen Maschine ausführen, werden wir wahrscheinlich (aber nicht einmal das ist zwingend der Fall) lediglich feststellen, dass die Zeit,die zwischen Beginn und Ende der Ausführung des Programms vergeht, unterschiedlich ist - das ist im Übrigen in der abstrakten Maschine gerade nicht beobachtbar, folglich trifft der Standard auch keine Aussage darüber. Was wir nicht zu "sehen" bekommen, sind die Schreibvorgänge auf va und vb. Nun könnten wir natürlich versucht sein, einen Debugger darauf anzuwenden, um diese Schreibvorgänge sichtbar zu machen - das setzt aber voraus, dass die betreffende Implementation zusätzliche Aussagen darüber macht, wo diese Variablen während des Programmablaufs zu finden sind. In Abwesenheit solcher zusätzlicher Garantien hindert die reale Maschine nichts daran, den Programmablauf sofort zu beenden (also die Variablen "wegzuoptimieren").
Der Standard schreibt keine bestimmte Relation zwischen realem Speicher oder CPU-Registern o.ä. und dem Speicher der abstrakten Maschine vor, nicht einmal, dass dieses Verhältnis während der Programmausführung unverändert bleibt. Das reale Objekt mag während der Ausführung an unterschiedlichen Stellen im Speicher oder auch in CPU-Registern zu finden sein oder überhaupt nicht existieren - wenn und solange das den Teil des beobachtbaren Verhaltens der realen Maschine, der mit dem beobachtbaren Verhalten der abstrakten Maschine korrespondiert, nicht beeinflusst.
Bezogen auf das ursprüngliche Thema bedeutet das, dass diese Fragestellung ohne Bezug auf eine konkrete Implementation (und ein konkretes Programm) sinnlos ist.