我很清楚在C ++中为struct动态分配内存。
struct Node
{
int item;
struct Node *next;
};
int main()
{
struct Node *head = new struct Node;
return 0;
}
这是一张照片。
堆中分配了8字节内存,head是指向它的指针。
但是当我遇到动态分配内存的时候,有几个问题困扰了我很久。有一个例子:
class Example
{
private:
int a;
double b;
public:
virtual void fun();
void fun2();
};
int main()
{
Example *e = new Example;
}
void Example::fun()
{
}
我的问题是:
1.我知道系统为int分配内存并在堆中分配双倍,系统是否还为堆中的fun()和fun2()分配内存?如果没有,哪里有趣()和 fun2()存储在应用程序内存中?
2.堆中分配了多少字节?
3.指针e如何取消引用fun()或fun2()函数?
4.取消引用正常功能与取消引用虚拟功能之间的区别是什么?
答案 0 :(得分:2)
首先,class
和struct
与C ++等效,唯一的区别是结构的默认访问修饰符为public
,而private
为struct Node
一类。 Node
的数据类型仅为Node *head = new Node;
,因此struct
就足够了,无需在任何地方重复sizeof(Example)
。
1.我知道系统为int分配内存并在堆中分配双倍,系统是否还为堆中的fun()和fun2()分配内存?如果没有,fun()和fun2()存储在应用程序内存中的哪个位置?
这些方法与所有其他函数一起驻留在代码 -block中。该方法源代码只有一个副本,而不是每个实例都有一个。
2.堆中分配了多少字节?
这取决于填充和对齐。 this
告诉您,该类需要多少字节。
3.指针e如何取消引用fun()或fun2()函数?
这取决于方法是否为虚方法。如果它不是它被编译就好像它是一个常规函数,除了指向SQLException
的指针也被传递(如果我没有错误,在寄存器中)。
对于虚拟功能和#4,请参阅here