Я читал о том, как выделяется память на C++.Организация памяти в 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) Теперь объект Ob размерных 5 байт (4 байта (INT), 1 байт (символов) - 32-разрядная ОС) создается на стеке, так как оно является автоматической переменной. Верный ?
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) Означает ли это PTR объект размером 8 байт (INT A (4 байта), символ * B (4 байты, т. е. это просто удерживающий адрес, указывающий на кучу) создается в стеке? Далее память объемом 10 байт (соответствующая новому символу [10] выделена на куче), на которую указывает содержимое char * b? Am I исправить?
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)
мы можем назвать из основной, как 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++ в качестве ответа? –
Я думаю, что все вопросы связаны, поэтому ставится под один вопрос. И ответ «да» или «нет» в основном .. Так что нечего набирать при ответе .. –
@Mat Отредактировал мой вопрос –