我一直在阅读有关如何在 C++ 中分配内存的信息。
需要提及的一些资源:
http://www.geeksforgeeks.org/memory-layout-of-c-program/
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
http://msdn.microsoft.com/en-us/library/vstudio/dd293645.aspx
http://computer.howstuffworks.com/c28.htm
我想根据我的阅读澄清几点:
根据http://www.geeksforgeeks.org/memory-layout-of-c-program/第 4 节堆栈“堆栈,其中存储自动变量,以及每次调用函数时保存的信息”
认为:
class myClass{
int a;
char b;
public:
myClass(int a,char b)
{
this->a = a;
this->b = b;
}
};
1)根据我所读到的,当我们编译这段代码时,二进制文件位于程序内存中,堆栈上还没有分配任何内容。正确的?
现在在我的主要:
int main()
{
myClass Ob(1,'c');
return 0;
}
2) 现在在堆栈上创建一个大小为 5 字节(4 字节 (int),1 字节 (char) - 32 位 OS)的对象 Ob,因为它是一个自动变量。正确的 ?
3)当构造函数myClass(int a,char b)
被调用时,临时变量(参数a,b)是否在构造函数的堆栈上创建,然后在创建对象Ob后销毁?就像我们通过按值传递参数来调用函数一样。
现在假设另一个类
class pointerClass {
int a;
char* b;
public:
pointerClass(int size){
b= new char[size];
a=size;
}
};
现在主要:
int main()
{
pointerClass ptr(10) ; //Step 1
}
4)这是否意味着在堆栈上创建大小为 8 字节(int a(4 字节)、char* b(4 字节,即它只是保存指向堆的地址)的 ptr 对象?此外还有 10 字节的内存(对应于new char[10] 是在堆上分配的)由 char* b 的内容指向的?我正确吗?
5)当我们通过引用将参数传递给函数时,fn (int *a,char* b)
或者fn(int& a,char& b)
这是否意味着在堆栈上为函数创建一个临时指针/引用,该指针/引用指向函数返回时被传递和销毁的实际对象?或者更确切地说,传递实际对象而不是在堆栈上为函数创建和销毁临时指针/引用?
这是我昨天问的,但我对答案不满意: 构造函数、复制构造函数和堆栈创建:C++
6)当我们重载一个 fn 时,例如fn(int a,char b)
fn(int& a,char& b)
我们可以从 main 调用fn(A,B)
下面的 cast
static_cast<void(*)(int, char)>(fn)(a, c); //Calls fn(int a,char b)
static_cast<void(*)(int&, char&)>(fn)(a, c);//Calls fn(int& a.char& b)
到底发生了什么?什么是 void (*) 。
谢谢