【问题标题】:Pointers to Incomplete Types指向不完整类型的指针
【发布时间】:2011-03-04 01:20:20
【问题描述】:

考虑以下几点:

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 类型的对象有多大?既然它可以明显地计算出大小,为什么不完整类型的常规对象非法?

【问题讨论】:

    标签: c++ oop pointers compiler-construction incomplete-type


    【解决方案1】:

    指向不完整类型的指针合法的原因正是因为编译器不需要知道它们的大小。

    您不能声明不完整类型的对象的原因是,正如您所提到的,因为编译器不知道对象有多大,因此无法为其分配空间。但是,在将 指针 声明为不完整类型时,其大小是已知的,因为通常机器上的所有指针都具有相同的大小。

    此外,当声明指向不完整类型对象的指针时,您不需要知道对象有多大。但是,如果您尝试使用一个不完整类型的对象,例如跟随该指针或尝试实例化该类型的对象,那么编译器会给您一个错误。

    简而言之,指针是合法的,因为它可以在编译器不知道所指向的大小的情况下创建。但是,如果您确实需要通过指针了解该对象的大小或布局,编译器将需要有关该类型的更多信息。

    【讨论】:

      【解决方案2】:

      指针的大小不依赖于它所指向的类型的大小。 int*Incomplete* 大小相同。

      但是,对于常规对象,大小是未知的。

      【讨论】:

      • 此外,分配将在运行时完成,此时应该知道对象的大小。由于指针的大小始终相同,因此它所引用的对象的实际大小可以在应用程序执行时确定。
      • 如果大小未知,分配代码将无法编译,对于类成员对象(如上例中的Incomplete::Bar),或新的动态分配,或分配在堆栈上。编译器必须输入对象所需内存块大小的任何地方 - 如果类型不完整,编译器会报错。
      【解决方案3】:

      编译器不需要知道Incomplete 的实例有多大,因为指针总是大小相同。

      【讨论】:

        【解决方案4】:

        编译器如何知道 Incomplete 类型的对象有多大?

        它没有。它适用于指针,因为编译器知道为指针分配的大小

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-30
          • 2021-12-31
          • 2012-08-15
          • 2015-10-09
          • 2011-08-02
          • 2013-03-11
          相关资源
          最近更新 更多