为什么在C ++中,类的大小必须始终为其用户所知?

时间:2015-11-06 10:25:32

标签: c++ constructor destructor new-operator pimpl-idiom

假设一个类在 .cpp 文件中完全定义,那么在源文件中你可以找到:

  • 构造函数已定义
  • 析构函数已定义
  • 定义的每个方法

为什么它的私有成员变量仍然必须在标题文件中呢? 为什么我们仍然需要 PIMPL 来摆脱它们?

如果在本课程中我还在源文件中定义了自己的 new operator ,为什么我还需要知道外部代码的大小?

是因为类仍可以堆栈分配吗? 如果是这样,那么为什么在堆栈上分配的“函数”不是.cpp文件中构造函数调用的一部分?

1 个答案:

答案 0 :(得分:2)

  

为什么它的私有成员变量仍然必须在头文件中呢?为什么我们仍然需要PIMPL来摆脱它们?

因为对于许多操作 - 在看到定义之后允许的操作 - 编译器需要知道对象实例的大小。更多详情如下。

  

如果对于这个类我也在源文件中定义了自己的新运算符,为什么我还需要知道外部代码的大小?

     

是因为类仍可以堆栈分配吗?如果是这样,那么"功能"谁在堆栈上分配不是.cpp文件中构造函数调用的一部分?

晴。编译器在函数调用启动时将堆栈指针移动局部变量的总大小是最简单和最有效的,然后在返回时将其移回。通常可以在编译时计算该大小。如果您有运行时函数返回单个对象大小,那么编译器将需要处理运行中的堆栈指针增量,并在运行时重复计算特定对象的地址作为先前分配的累积总数,或者使用memory /注册以保持一组指针或偏移到它们最终的任何地方。 (这是大多数C ++编译器不支持数组维度运行时规范的主要原因之一。)

我说"部分"因为它不只是关于堆栈:类似的问题适用于静态/全局和线程局部对象。