2014-10-29 27 views
10

根據標準,在[expr.sizeof](5.3.3.2),我們得到:爲什麼參考類型的sizeof會給你類型的大小?

當施加到一個參考或引用類型,其結果是被引用類型的大小。

這似乎與事實引用一起去不明[dcl.ref(8.3.2.4):

它是不確定是否參考需要存儲

但是在我的語言中出現這種不一致的情況似乎很奇怪。無論參考文獻是否需要存儲,能否確定參考文獻使用的大小都不重要?看到這些結果似乎只是錯誤:

sizeof(vector<int>) == 24 
sizeof(vector<int>*) == 8 
sizeof(vector<int>&) == 24 
sizeof(reference_wrapper<vector<int>>) == 8 

什麼是定義想要sizeof(T&) == sizeof(T)背後的原因?

+0

我同意這裏有不一致,但這是如何定義引用類型。引用表示它們引用的對象。執行對象的操作應該與對該對象的引用執行相同操作的結果相同。如果C++有更好的聲明語法,我認爲如果有兩種不同類型的聲明會更好,比如'obj vector v;'和'ref vector vref;',我認爲這會更清楚,但是這個不是我們生活的世界。「 – 2014-10-29 13:09:03

+5

」能夠確定參考使用多少尺寸不是很重要嗎?「 - 您可以確定它:由於引用**是**對象,因此它使用與引用對象相同數量的存儲。這裏沒有不一致。 – 2014-10-29 13:11:46

+0

@TheParamagneticCroissant不一致之處在於引用的處理方式與其他類型修飾符不同(也因爲不能引用引用)。它可能不太可怕,但它*是不一致的。同樣,數組類型也有不一致之處。 – 2014-10-29 13:14:17

回答

11

該選擇有些隨意,試圖完全證明兩個選項之一會導致循環形而上學的論點。

引用的目的是作爲對象本身的別名;根據這個推理,他們都有相同的大小(和地址),這是語言所指定的。

抽象是有漏洞的 - 有時引用有自己的存儲,與對象分開 - 導致類似你指出的異常。但是當我們需要將「參考」作爲與對象分離的實體來處理時,我們有指點。

+2

+1最好的外行人對參照指針的解釋我見過。而且你甚至不需要提及指針;) – 2014-10-30 02:15:11

11

參數1:引用應該是您的對象的同義詞,因此引用的接口應該與對象的接口完全相同,也是所有運算符都應該以相同的方式對對象和引用(類型運算符除外)。

它將使感,在下面的代碼:

MyClass a; 
MyClass& b = a; 
char a_buf[sizeof(a)]; 
char b_buf[sizeof(b)]; // you want b_buf be the same size as a_buf 
memcpy(&a, a_buf, sizeof(a)); 
memcpy(&b, b_buf, sizeof(b)); // you want this line to work like the above line 

參數2:從C++視圖引用的標準的觀點是引擎蓋下的東西,它甚至沒有,如果他們佔用內存或者說不,所以它不能說如何獲得它們的大小。

如何獲得參考大小:由於所有編譯器引用都是通過常量指針的幫助實現的,並且它們佔用內存,所以有一種方法可以知道它們的大小。

class A_ref 
{A& ref;} 
sizeof(A_ref); 
+1

+1這也是如此。 – 2014-10-29 13:28:17

+0

這解釋了爲什麼參考的'sizeof'應該給出所指對象的類型的大小......但並不是爲什麼'sizeof'參考類型應該這樣做。 – 2014-10-29 13:39:01

+1

@BenVoigt'b'被聲明爲'MyClass&',所以對於sizeof(b)和sizeof(MyClass&)'給出相同的結果是有意義的(對我來說)。解釋爲什麼兩個人中的一個給出sizeof(MyClass)'應該足夠了,我想。 – hvd 2014-10-29 13:41:11

2

知道引用需要多少存儲空間並不重要,只需要添加引用引起的存儲需求變化即可。並且您可以確定:

struct with 
{ 
    char c; 
    T& ref; 
}; 

struct without 
{ 
    char c; 
}; 

return sizeof (with) - sizeof (without); 
+0

什麼時候知道這很重要? – 2014-10-29 13:42:30

+1

@MobyDisk:因爲它可以對性能產生很大的影響。處理器緩存可以容納更多'沒有'的數據類型,大概是數據類型'with'的8或16倍。 – 2014-10-29 13:46:39

+0

@BenVoigt你的代碼沒有考慮到alignemnt – 2014-10-29 13:50:11

相關問題