Darf Compiler member entfernen?
-
@swordfish sagte in Darf Compiler member entfernen?:
Why not? Solange as-if:
Naja, aus eben dem Grund den auch schon @Regenbogenschaf genannt hat.Die Anordnung der Member darf ja auch nicht verändert werden, obwohl das für das theoretische Verhalten ja überhaupt keinen Unterschied macht.
Es scheint also noch mehr Ausnahmen in diesem Zusammenhang zu geben, als unter dem von dir geposteten Link aufgelistet sind.
@hustbaer Ist das also nur bei calls von "für den Compiler nicht sichtbaren" Code garantiert?
-
@happystudent sagte in Darf Compiler member entfernen?:
Naja, aus eben dem Grund den auch schon @Regenbogenschaf genannt hat. Die Anordnung der Member darf ja auch nicht verändert werden,
Um das beobachten zu können müsste ein Programm erst einmal die Adressen von zwei Membern nehmen. Dazu müssen die Dinger dann auf jeden Fall existieren.
-
@swordfish sagte in Darf Compiler member entfernen?:
Um das beobachten zu können müsste ein Programm erst einmal die Adressen von zwei Membern nehmen. Dazu müssen die Dinger dann auf jeden Fall existieren.
Sie werden schon deshalb existieren, weil das Programm ihre Adresse nimmt.
-
@regenbogenschaf Nichts anderes habe ich geschrieben
-
@swordfish sagte in Darf Compiler member entfernen?:
Nichts anderes habe ich geschrieben
Du schriebst "dazu müssen" und nicht "deshalb werden". Aus deinen Worten wird nicht ersichtlich, was Ursache und was Wirkung ist.
-
Yes, no, is clear.
-
@swordfish : Deinen Text kann man auch so verstehen, dass das Ermitteln der Adresse fehlschlägt, sollte der Member wegoptimiert worden sein.
-
Yes, no, is clear.
-
Warum muß dazu erst die Adresse eines Members benutzt werden? Man könnte auch einfach den gesamten Speicher auslesen (wenn man vorher bestimmte Werte den einzelnen Membern zugewiesen hat)..
-
@swordfish sagte in Darf Compiler member entfernen?:
Um das beobachten zu können müsste ein Programm erst einmal die Adressen von zwei Membern nehmen. Dazu müssen die Dinger dann auf jeden Fall existieren.
Ja, aber das kriegt der Compiler von Programm A nicht mit, wenn Programm B (auf welche Art auch immer) den Speicher von A ausliest.
-
@th69 könnte klappen:
struct test {char c1; char c2; char c3;}; struct test t; t.c1 = 1; t.c3 = 2; char *p = (char*)&t; printf ("%d, %d, %d\n", p[0], p[1], p[2]);
Kommt 1,irgendwas,2, wurde c2 nicht wegoptimiert.
kommt 1,2,irgendwas, ist c2 nicht da.
-
@happystudent sagte in Darf Compiler member entfernen?:
Ja, aber das kriegt der Compiler von Programm A nicht mit, wenn Programm B (auf welche Art auch immer) den Speicher von A ausliest.
Das hat nichts mehr mit dem Standard zu tun.
-
@th69 sagte in Darf Compiler member entfernen?:
Warum muß dazu erst die Adresse eines Members benutzt werden? Man könnte auch einfach den gesamten Speicher auslesen (wenn man vorher bestimmte Werte den einzelnen Membern zugewiesen hat).
Dazu müssen die Member sowieso existieren also im Kontext der Fragestellung in diesem Thread ein no brainer.
-
@regenbogenschaf sagte in Darf Compiler member entfernen?:
@th69 könnte klappen:
struct test {char c1; char c2; char c3;}; struct test t; t.c1 = 1; t.c3 = 2; char *p = (char*)&t; printf ("%d, %d, %d\n", p[0], p[1], p[2]);
Kommt 1,irgendwas,2, wurde c2 nicht wegoptimiert.
kommt 1,2,irgendwas, ist c2 nicht da.Kommt ... undefined behaviour.Ne, sorry, nicht ub. Aber es können trotzdem padding-bytes sein.
-
@swordfish sagte in Darf Compiler member entfernen?:
Kommt ... undefined behaviour.
Ja, und allein schon die Adresse von t zu nehmen, dürfte den Compiler dazu bringen, den unbenutzten Member nicht wegzuoptimieren.
-
Was soll der quatsch? Die Frage war, ob ein Compiler es darf. Die Antwort ist auch klar: Ja, er darf, wenn sich dadurch das beobachtbare Verhalten des Programms nicht ändert.
-
@swordfish sagte in Darf Compiler member entfernen?:
Aber es können trotzdem padding-bytes sein.
Dann nehme man 3 int, dann dürfte er IMHO nur hinten auffüllen, bis die Länge ein Vielfaches von 4 ist.
-
@swordfish sagte in Darf Compiler member entfernen?:
Die Frage war, ob ein Compiler es darf. Die Antwort ist auch klar: Ja, er darf, wenn sich dadurch das beobachtbare Verhalten des Programms nicht ändert.
Das Verhalten würde sich vielleicht schon durch die Messung ändern. Heisenberg lässt grüßen.
-
was willst du da messen?
-
@swordfish sagte in Darf Compiler member entfernen?:
was willst du da messen?
Physikalisches Vorhandensein unbenutzter Struct-Members.