C/C++

Где располагается нессылочная переменная в ссылочном объекте с++?

Допустим, я создал класс:
class X
{
QVector var;
};

Теперь создаю объект этого класса, но как ссылку:
X * x = new X;

Вопрос - переменная var у объекта x будет создана в стеке или куче?
Вообще - как вы выбираете где создавать переменные - в куче или стеке?
Важно ли это вообще?
Anton Abakumov
Anton Abakumov
409
любой класс/структура/массив в конченом итоге представляют из себя агрегат.
агрегат это последовательное хранилище, содержащие переменные разных или одинаковых типов.
размер агрегата всегда больше или равен сумарному размеру содержашихся в нём переменных.
По такому-же принципу работает ящик для столовых приборов в котором есть отсеки ля вилок и ложек. сам ящик это агрегат а отсеки это переменные или ещё меньшие агрегаты.
там где лежит твой ящик там и находятся все твои столовые приборы.
В твоём случае ты выделяешь память для класса 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 байта.
Аndrey Volkov
Аndrey Volkov
3 177
Лучший ответ
Anton Abakumov Благодарю за хороший ответ! Я так понял в куче располагают те объекты, размер которых потенциально может увеличиваться или быть большим. Например, динамический массив данных.
Это не ссылка, а указатель. Ответ: в динамической памяти.