2010-08-11 10 views
5

Ein paar einfache Fragen.Die Reihenfolge der Daten im Speicher

const int gFirst; 
const int gSecond; 

struct Data 
{ 
    static int First; 
    static int Second; 

    int first; 
    int second; 
}; 

Data data; 

Ist garantiert, dass die folgenden Aussagen zutreffen?

  1. &gFirst < &gSecond
  2. &Data::First < &Data::Second
  3. &data.first < &data.second

Antwort

8

1) Dieses Ergebnis ist nicht spezifiziert.
2) Dieses Ergebnis ist nicht spezifiziert. *
3) Ja.

Der relevante Abschnitt in der Norm ist §5.9/2. Relationale Vergleiche zwischen den Zeigern und pq sind nur angegeben, wenn:

  • pq und auf dasselbe Objekt oder die Funktion, einen Punkt hinter dem Ende desselben Arrays oder beide null sind. In diesem Fall sind p <= q und p >= q wahr, und p < q und p > q sind falsch.
  • p und q Punkt auf nicht statische Datenelemente des gleichen Objekts, vergleicht der Zeiger auf das später deklarierte Mitglied größer. (Hinweis: Dieser Vergleich kann nicht zwischen Zugriffsbezeichnern erfolgen.)
  • p und q zeigen Sie auf Elemente innerhalb desselben Arrays oder nach dem Ende des Arrays, den Zeiger auf das Element mit dem höheren Index oder auf eins nach dem Ende von Das Array vergleicht größer.
  • p und q zeigen auf Datenelemente des gleichen Union-Objekts, in diesem Fall vergleichen sie gleich.

In allen anderen Fällen ist das Ergebnis nicht angegeben.

* Da sie statisch sind, erhalten sie (offensichtlich) nicht die "nonstatic member" -Regeln. Sie werden in einer Übersetzungseinheit definiert und sind daher genau wie jeder andere Zeiger. (Nicht bekannt.)


Hinweis! Es gibt einen Weg totale Ordnung zu bekommen, und das ist über std::less<void*>

Dies ist §20.3.3/8 (und alle anderen Vergleichsfunktionsobjekte.):

Für Vorlagen greater, less , greater_equal, und less_equal, ergeben die Spezialisierungen für jeden beliebigen Zeigertyp eine Gesamtbestellung, auch wenn die eingebauten Operatoren <, >, <=, >= dies nicht tun.

So, während Sie wissen nicht, ob std::less<void*>(&gFirst, &gSecond)true oder false ist, werden Sie garantiert:

std::less<void*>(&gFirst, &gSecond) == 
    std::greater<void*>(&gSecond, &gFirst); 
std::less<void*>(&Data::First, &Data::Second) == 
    std::greater<void*>(&Data::Second, &Data::First); 

Welche nützlich erweisen können.

6

Die Antwort:

1) Not guaranteed. 
    But probably. 
    But the order of initialization is guaranteed. 
2) No. 
    You just have the declaration here. 
    You need to to define the instances in a source file. 
    Then they will behave the same way as the objects in (1). 
3) Yes. 
+0

Zu 1) Ich denke, die Reihenfolge der Initialisierung in einer Quelldatei ist garantiert. Die Initialisierungsreihenfolge von mehreren Quelldateien ist nicht definiert. –

+0

Ich war schlampig mit Frage 2 für die Annahme, Sie würden auch die Daten in einer anderen Datei in der gleichen Reihenfolge initialisieren, wie die Variablen hier deklariert sind. Mein Fehler. Dieser 2. Fall ist eigentlich derjenige, an dem ich mich am meisten interessiere. – zeroes00

Verwandte Themen