2015-10-05 57 views
2

考慮以下兩個代碼段(爲了A和B)的名稱的:可用性在C++中的結構

struct abc { 
    int a {}; 
    abc* next; 
}; 

struct abc { 
    int a {}; 
    abc next; 
}; 

事實是:
1.片段甲已驗證。
2.摘錄B無效。

參數:

B是無效的,因爲編譯器不能在聲明的時間來確定ABC的代碼段B中的大小。 (Stroustrup的,C++編程語言,8.2.2

我的疑問:

不是abc片斷A的編譯過程中所需的大小?聲明指針爲abc時,不需要大小abc?否則在編譯期間,編譯器如何知道如何解引用abc*

+0

我認爲原因可能是遞歸計算abc大小。當編譯器計算abc的大小時,請考慮一下。嘗試計算這個公式:size(abc)= size(int {})+ size(abc) – Adem

+3

指針的大小不依賴於指向的類型的大小。 –

+2

這是[Inception](http://www.imdb.com/title/tt1375666/)適用於軟件開發。結構體中的結構體struct中的結構體中的結構體.... – HelloWorld

回答

9

C++區分使用聲明和之間。要聲明一個指針,指針對象的大小不需要知道。但是,引用指針的代碼確實需要知道它的大小。

7

在你的第二個例子中,你有一個類包含一個相同類的實例,它將遞歸地包含同一個類的一個實例。

由於C++中的每個對象必須是至少爲1的尺寸,這意味着abc類的任何實例將是無限的(1 + 1 + 1 + ...)。

第一個例子不是問題,因爲指向任何對象的指針的大小是一個常量,因此abc的大小是有限的,創建這樣的對象可以在不創建無限對象的情況下完成(指針可以指向nullptr或現有對象)。

+0

我更喜歡這種推理,而不是更常見的「尺寸未知」的惡作劇,儘管兩者都是同樣有效的方法。 –

+0

@LightnessRacesinOrbit公平,我也是。 –

0

使用指針運算或使用[]運算符進行參照時,需要變量的大小。

在編譯時,在聲明指向它的指針時,不需要引用對象的大小。

1

片段B的問題是它不僅包含指向另一個abc的指針,而且包含整個abc的內存分配。反過來,它包含整個abc。其中包含整個abc。其中包含整個abc。看看我們要去哪裏?

代碼片段A沒有這個問題;它只是存儲一個固定大小的指針。該指針可能指向另一個有效的abc,但它也可以指向null,本身,內存中的隨機點或任何其他指針。