[英]Pointers to Incomplete Types
考慮以下:
class Incomplete;
class Complete
{
Incomplete* Foo; // Will only compile if Foo is a pointer.
};
class Incomplete
{
Complete Bar; // Bar can be a pointer or an object.
};
指向不完整類型的指針是如何合法的? 編譯器如何知道Incomplete
類型的對象有多大? 而且因為它可以明顯地計算出大小,為什么不完整類型的常規對象是非法的?
指針的大小不依賴於它指向的類型的大小。 int*
和Incomplete*
具有相同的大小。
但是,對於常規對象,大小未知。
指向不完整類型的指針是合法的,正是因為編譯器不需要知道它們的大小。
正如您所提到的,您無法聲明不完整類型的對象的原因是因為編譯器不知道對象有多大,因此無法為其分配空間。 但是,在聲明指向不完整類型的指針時 ,大小是已知的,因為通常計算機上的所有指針都具有相同的大小。
而且,在聲明指向不完整類型的對象的指針時,您不需要知道對象的大小。 但是,如果您嘗試使用不完整類型的對象,例如通過跟蹤該指針或嘗試實例化該類型的對象,則編譯器將給您一個錯誤。
簡而言之,指針是合法的,因為它可以在編譯器不知道指向的大小的情況下創建。 但是,如果您確實需要通過使用指針來了解該對象的大小或布局,則編譯器將需要有關於該類型的更多信息。
編譯器不需要知道Incomplete
大實例有多大,因為指針總是大小相同。
編譯器如何知道Incomplete類型的對象有多大?
它沒有。 它適用於指針,因為編譯器知道要為指針分配的大小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.