Допустим, я создал класс:
class X
{
QVector var;
};
Теперь создаю объект этого класса, но как ссылку:
X * x = new X;
Вопрос - переменная var у объекта x будет создана в стеке или куче?
Вообще - как вы выбираете где создавать переменные - в куче или стеке?
Важно ли это вообще?
C/C++
Где располагается нессылочная переменная в ссылочном объекте с++?
любой класс/структура/массив в конченом итоге представляют из себя агрегат.
агрегат это последовательное хранилище, содержащие переменные разных или одинаковых типов.
размер агрегата всегда больше или равен сумарному размеру содержашихся в нём переменных.
По такому-же принципу работает ящик для столовых приборов в котором есть отсеки ля вилок и ложек. сам ящик это агрегат а отсеки это переменные или ещё меньшие агрегаты.
там где лежит твой ящик там и находятся все твои столовые приборы.
В твоём случае ты выделяешь память для класса X. он по размеру равен сумме размеров содержавшихся в нём элементов, для того чтобы обобщить и расположить по выделенному для него аддресу все переменные которые он содержит.
Полученный адрес и будет содержать твои переменные, просто он их обобщил.
Ты выделил свой класс на куче а значит всё что внутри него лежит, и лежит на куче.
ты можешь убедится в этом проведя простейший опыт.
int main(int argc, char** argv)
{
struct MyClass {
int v;
float b;
};
MyClass* c = new MyClass();
std::cout << (void*)c << std::endl;
std::cout << (void*)&c->v << std::endl;
std::cout << (void*)&c->b << std::endl;
return 0;
}
так-как агрегат это просто обобщение то можно предположить что адрес на сам объект класса и будет адресом на переменную v, и да так и есть.
первые две строчки выведенного текста программы нам доказывают это, тем что равны между собой.
мы так-же видим адрес на переменую b которая расположена внутри нашего агрегата, она отличается от других адресов тем что сдвинута относительно начала адреса, где лежит v, на 4 байта.
И тот же опыт только переменная находится во фрейме вызванной функции (на стеке)
int main(int argc, char** argv)
{
struct MyClass {
int v;
float b;
};
MyClass c;
std::cout << (void*)&c << std::endl;
std::cout << (void*)&c.v << std::endl;
std::cout << (void*)&c.b << std::endl;
return 0;
}
И тоже первые два адреса равны. и последний отличается на 4 байта.
агрегат это последовательное хранилище, содержащие переменные разных или одинаковых типов.
размер агрегата всегда больше или равен сумарному размеру содержашихся в нём переменных.
По такому-же принципу работает ящик для столовых приборов в котором есть отсеки ля вилок и ложек. сам ящик это агрегат а отсеки это переменные или ещё меньшие агрегаты.
там где лежит твой ящик там и находятся все твои столовые приборы.
В твоём случае ты выделяешь память для класса X. он по размеру равен сумме размеров содержавшихся в нём элементов, для того чтобы обобщить и расположить по выделенному для него аддресу все переменные которые он содержит.
Полученный адрес и будет содержать твои переменные, просто он их обобщил.
Ты выделил свой класс на куче а значит всё что внутри него лежит, и лежит на куче.
ты можешь убедится в этом проведя простейший опыт.
int main(int argc, char** argv)
{
struct MyClass {
int v;
float b;
};
MyClass* c = new MyClass();
std::cout << (void*)c << std::endl;
std::cout << (void*)&c->v << std::endl;
std::cout << (void*)&c->b << std::endl;
return 0;
}
так-как агрегат это просто обобщение то можно предположить что адрес на сам объект класса и будет адресом на переменную v, и да так и есть.
первые две строчки выведенного текста программы нам доказывают это, тем что равны между собой.
мы так-же видим адрес на переменую b которая расположена внутри нашего агрегата, она отличается от других адресов тем что сдвинута относительно начала адреса, где лежит v, на 4 байта.
И тот же опыт только переменная находится во фрейме вызванной функции (на стеке)
int main(int argc, char** argv)
{
struct MyClass {
int v;
float b;
};
MyClass c;
std::cout << (void*)&c << std::endl;
std::cout << (void*)&c.v << std::endl;
std::cout << (void*)&c.b << std::endl;
return 0;
}
И тоже первые два адреса равны. и последний отличается на 4 байта.
Anton Abakumov
Благодарю за хороший ответ! Я так понял в куче располагают те объекты, размер которых потенциально может увеличиваться или быть большим. Например, динамический массив данных.
Это не ссылка, а указатель. Ответ: в динамической памяти.
Похожие вопросы
- При совершении арифметических операций с переданными в рекурсивную функцию переменными, переменные меняются(Си)
- Если в редакторе имя переменной это строковое значение то после компиляции при поиске переменная есть как адресс?
- Глобальная переменная. (Си)
- Записать значения чисел фиббоначи в переменные и вернутт одновременно три значения переменных.
- Как создать под-переменную в python?
- Для заданных с клавиатуры значений переменных x и n вычислить
- Лютый препод не унимается. Просит без ООП написать функцию обмена значениями переменных любого типа!
- Чем именно обрабатываются не регистровые переменные если регистровые обрабатываются регистрами?
- Зачем нужны переменные с припиской 16, 32 и т.д?
- Ошибка C# Не используется переменная.