【发布时间】:2013-05-01 00:15:47
【问题描述】:
我一直在阅读有关 C++ 中如何分配内存的信息。
需要提及的一些资源:
http://www.geeksforgeeks.org/memory-layout-of-c-program/
http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory
Object creation on the stack/heap?
Global memory management in C++ in stack or heap?
http://msdn.microsoft.com/en-us/library/vstudio/dd293645.aspx
Heap / Stack and multiple processes
Do different programs gets their memory from a common heap or from a separate heap?
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 字节的 ptr 对象(int a(4 字节)、char* b(4 字节,即它只是保存指向堆的地址)?此外还有 10 字节的内存(对应于new char[10] is assigned on heap)是char* b的内容指向的那个?我说的对吗?
5) 当我们通过引用(例如fn (int *a,char* b) 或fn(int& a,char& b))将参数传递给函数时,这是否意味着会在堆栈上为函数创建一个临时指针/引用,该函数指向被传递和销毁的实际对象函数何时返回?还是传递实际对象而不是在堆栈上为函数创建和销毁临时指针/引用?
这是我昨天问的,但我对答案不满意: Constructor, Copy Constructor and Stack Creation : C++
6) 当我们重载 fn 时,例如 fn(int a,char b) fn(int& a,char& b) 我们可以从 main 调用 fn(A,B)
有以下演员表
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)
这里到底发生了什么?什么是无效(*)。
谢谢
【问题讨论】:
-
我觉得你需要把这个问题分成几个小问题。你希望我们写 C++ 书作为答案吗?
-
我认为所有问题都是相关的,因此放在一个问题下。答案主要是“是”或“不是”..所以在回复时输入的内容不多..
-
如果你问我,这也不是一个真正的编程问题。只是一个“我认为它可以这样工作,可以吗”之类的问题。根据约翰的回答,他似乎在所有问题上都是正确的。
-
我认为 C++(作为标准定义的语言)与运行程序的计算机的内存模型并不像您想象的那样紧密耦合。例如。在 C++ 中定义变量并不一定意味着堆栈上的任何内容都发生了变化。
-
这确实不适合 SO。 SO 是针对具体的实际编程问题,而不是从头开始学习操作系统和语言设计。