如果定义代表分配内存。为什么在实例化对象之前,C ++中的类定义没有分配内存。
答案 0 :(得分:8)
C ++类定义不分配内存。 class
与typedef
和struct
类似。你在哪里得到“定义代表分配记忆”的想法?你能提供报价或参考吗?
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
......
因此,类定义占用了一些内存,虚拟表可以访问这些信息。