2010-08-11 65 views
5

一些簡單的問題。內存中的數據順序

const int gFirst; 
const int gSecond; 

struct Data 
{ 
    static int First; 
    static int Second; 

    int first; 
    int second; 
}; 

Data data; 

是否保證以下陳述是真實的?

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

回答

8

1)該結果是不確定的。
2)此結果未指定。*
3)是。

標準中的相關部分是§5.9/ 2。

  • pq指向相同的對象或功能,指向一個過去的同一陣列的端部,或者兩者都爲空:當僅指定的指針pq之間關係的比較。在這種情況下,p <= qp >= q爲真,且p < qp > q爲假。
  • p and q指向同一對象的非靜態數據成員,指向稍後聲明的成員的指針比較大。 (注意,這個比較不能在訪問說明符之間)。
  • pq指向同一個數組內的元素或指向數組末尾的元素,指向具有較高下標的元素的指針或指向元素後面的元素的指針數組比較大。
  • pq指向同一聯合對象的數據成員,在這種情況下它們相等。

在所有其他情況下,未指定結果。

*因爲它們是靜態的,它們(顯然)不會得到「非靜態成員」規則。它們將在某個翻譯單元中定義,因此就像任何其他指針一樣。 (未指定)


注意!有一種方式來獲得總排序,那就是通過std::less<void*>

這在§20.3.3/ 8(和所有其他的比較函數對象。):

對於模板greaterlessgreater_equalless_equal,即使內置運算符<,>,<=,>=沒有,指針類型的任何 的專業化產生總訂單。

所以,當你不知道,如果是std::less<void*>(&gFirst, &gSecond)truefalse,你保證:

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

可以證明是有用的。

6

答案:

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

到1)我認爲在一個源文件中的初始化順序是保證。多個Sourcefiles的初始化順序未定義。 – 2010-08-11 06:25:53

+0

對於問題2,我很sl assuming,因爲我們假設您也將以與此處聲明的變量相同的順序初始化另一個文件中的數據。我的錯。這個案例實際上是我最感興趣的案例。 – zeroes00 2010-08-11 06:27:32