类定义和内存分配

时间:2010-02-17 15:36:39

标签: c++ class definition

如果定义代表分配内存。为什么在实例化对象之前,C ++中的类定义没有分配内存。

6 个答案:

答案 0 :(得分:8)

C ++类定义不分配内存。 classtypedefstruct类似。你在哪里得到“定义代表分配记忆”的想法?你能提供报价或参考吗?

C ++对象创建(通过new)分配内存。

答案 1 :(得分:6)

类定义被编译成代码。该代码是过程映像的一部分。过程映像确实被操作系统加载到RAM中(因此耗尽了内存),但它不是进程可用内存空间的一部分。

当您创建类的对象时,您正在进程的可用内存空间中使用内存。进程的可用内存空间由2个位置之一的内存组成。 The stack or the heap

堆栈或堆上的类定义没有占用内存。当您创建类的对象时,它将始终在堆栈或堆上。

答案 2 :(得分:2)

类声明告诉编译器和运行时为每个类实例分配多少内存,但仅在请求时。类定义生成类行为的可执行代码。

答案 3 :(得分:1)

这一点确实如此。 C / C ++中的所有类和结构都有2个带有“名称”的地方。

Class <Name>
{
     ...
}<Vars>;

你要做的是定义&lt; Vars&gt; Class&lt; Name&gt;的变量。所有的Vars都会为它们分配内存,但是你通常做的是省略&lt; Vars&gt;部分,你得到一个空的变量定义,比如写

int;

答案 4 :(得分:0)

如果将define定义为指向类的指针,则C ++不会自动为对象分配内存。在C ++中,内存管理必须在您的代码中完成,这取决于应用程序的用例,具有优点和缺点。

Class* test;

上面不会分配内存,它默认指向什么。

Class test;

以上内容可以使用,但它有本地范围。

答案 5 :(得分:0)

班级信息存储在符号表中。如下代码:

#include<iostream>
#include <typeinfo>
using namespace std;
class Base {
public:
    Base() { }
    virtual void test(){ }
};
class Derived: public Base {
};

int main() {
    // print Derived's info
    Base* b = new Derived;
    const char* str = typeid(*b).name();
    cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl;

    // print Base's info
    str = typeid(Base).name();
    cout<<str<<"'s address = "<<hex<<"0x"<<(long)str<<endl;
    return 0;
}

使用g ++编译此文件并运行:

7Derived's address = 0x400e68
4Base's address = 0x400e98

可执行文件是&#34; a.out&#34;,并使用&#34; readelf -a a.out&#34;获取更多信息的命令:

Symbol table '.symtab' contains 98 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
    ......
    79: 0000000000400e68     9 OBJECT  WEAK   DEFAULT   15 _ZTS7Derived
    80: 0000000000400e98     6 OBJECT  WEAK   DEFAULT   15 _ZTS4Base
    ......

因此,类定义占用了一些内存,虚拟表可以访问这些信息。