C+中的内存组织+; 我一直在阅读C++中如何分配内存。
需要提及的几个资源: 根据我的阅读,我想澄清几点: 根据第4节Stack“Stack,其中存储自动变量,以及每次调用函数时保存的信息” 假设:C+中的内存组织+; 我一直在阅读C++中如何分配内存。,c++,compiler-construction,C++,Compiler Construction,需要提及的几个资源: 根据我的阅读,我想澄清几点: 根据第4节Stack“Stack,其中存储自动变量,以及每次调用函数时保存的信息” 假设: class myClass{ int a; char b; public: myClass(int a,char b) { this->a = a; this->b = b; } }; 1) 根据我所读到的,当我们编译这段代码时,二进制文件位于程序内存中,堆栈上还没有分配任何内容。对吗
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字节(inta(4字节)、char*b(4字节,即,它只是保存一个指向堆的地址)的ptr对象?此外,由char*b的内容指向的10字节内存(对应于堆上分配的新char[10])是否正确
5) 当我们通过引用将参数传递给函数时,例如fn(int*a,char*b)
或fn(int&a,char&b)
这是否意味着在堆栈上为函数创建一个临时指针/引用,该指针/引用指向函数返回时传递和销毁的实际对象?或者更确切地说是传递实际对象,而不是在堆栈上为函数创建和销毁临时指针/引用
我昨天问了这个问题,但我对答案不满意:
6) 当我们重载一个fn时,比如fn(int-a,char-b)
fn(int-a,char-b)
我们可以从main调用fn(a,b)
下铸
static_cast(fn)(a,c)//调用fn(整数a,字符b)
static_cast(fn)(a,c)//呼叫fn(int&a.char&b)
这里到底发生了什么?什么是空(*)
谢谢
void(*)(int,char)
是一种类型,特别是一个指向void函数的指针,该函数包含两个参数和一个int和一个char。显然,这个强制转换迫使编译器选择您想要的函数的版本,尽管对我来说这是可能的sizeof
即可获得大小首先,我应该指出,您展示的图表非常简单 依赖于系统。例如,在Solaris下,操作系统 系统内存根本没有映射到用户地址空间。 而最频繁的映射只有三个映射段 用户内存,至少在程序开始时:一个代码 底部分段(但不是绝对底部,因为 地址0通常不会被映射),它上面的数据段, 顶部有一个堆栈段(向下生长),带有一个大的 堆栈和数据之间的未映射内存孔 一旦动态启动,所有这些都会完全改变 装载