Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
qazc
0 / 0 / 1
Регистрация: 01.11.2011
Сообщений: 26
#1

Есть ли выигрыш в памяти при объявлении объекта через указатель в данной программе? - C++

29.08.2013, 18:23. Просмотров 409. Ответов 9
Метки нет (Все метки)

Доброго времени суток! Подскажите, пожалуйста, есть ли разница в количестве задействованной памяти если объект класса создавать через указатель(как в данном случае) или обычым образом(Car myCar; ) в данной программе? Ведь после вывода последнего сообщения программа завершается и память, выделенная под программу, освобождается.
Или выигрыш с памятью был бы в случае, если бы на этом программа не завершалась, но данный объект уже был бы не нужен?

Файл Class.h:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 class Car {
    public: 
 
        std::string getName(){
            return name;
        }
 
        void setName(std::string car_name) {
            name = car_name;
        }
 
        int getSpeed(){
            return speed;
        }
 
        void setSpeed(int car_speed){
            speed = car_speed;
        }
 
    private:
        
        std::string name;
        int speed;
};
Файл Car.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 #include <iostream>
#include "Class.h"
 
int main() {
    
    Car *myCar = new Car;
    std::string name;
    int speed;
 
    std::cout << "Input car name: ";
    getline(std::cin,name);
 
    std::cout << "Input speed for " << name << ": ";
    std::cin >> speed;
 
    myCar->setName(name);
    myCar->setSpeed(speed);
 
    std::cout << "Car name is " << myCar->getName() << " and it speed is " << myCar->getSpeed() << std::endl;
 
delete myCar;
 
return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.08.2013, 18:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Есть ли выигрыш в памяти при объявлении объекта через указатель в данной программе? (C++):

Модификация объекта string через ссылку и указатель - C++
Создайте две функции: первая должна получать аргумент типа string*, вторая - srting&amp;. Каждая функция должна изменять объект string своим...

Создание объекта через указатель на базовый абстрактный класс - C++
Есть абстрактный класс, от него наследуется 3 класса. В программе предусмотрено создание нового объекта(добавление клиента страховой...

Передача в контейнер объекта через указатель на базовый класс - C++
Передаю в stl контейнер list указатель на производный класс, предварительно приведя его к типу производного класса - программа вылетает.В...

Создание копии объекта используя объявление через указатель - C++
Здравствуйте. Имеется такой код: #include &lt;iostream&gt; #include &lt;cstring&gt; using namespace std; class medicament { private: ...

Как в данной программе использовать указатель на массив записей? - Turbo Pascal
Задание: Предусмотреть контроль за размером динамически распределяемой памяти (ДРП), а также ее освобождение после выполнения необходимых...

Выделение памяти при обычном объявлении - C (СИ)
Пусть имеется некий код int main(){ int a, b, c, d, e, f , g , e; int f = 15; int z = 51; double doub = 23.1; int...

9
alsav22
5426 / 4821 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.08.2013, 18:27 #2
Цитата Сообщение от qazc Посмотреть сообщение
Подскажите, пожалуйста, есть ли разница в количестве задействованной памяти если объект класса создавать через указатель(как в данном случае) или обычым образом(Car myCar; ) в данной программе?
Количество памяти задействуется одно и тоже, но в разных областях памяти: через указатель - в динамической памяти, обычнам обрзом - на стеке.
Цитата Сообщение от qazc Посмотреть сообщение
Или выигрыш с памятью был бы в случае, если бы на этом программа не завершалась, но данный объект уже был бы не нужен?
Да. На стеке объект будет храниться до окончания программы, если же вы создали объект динамически, то можете в любой момент освободить память под ним.
2
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
29.08.2013, 18:45 #3
Цитата Сообщение от alsav22 Посмотреть сообщение
через указатель - в динамической памяти
Правильней сказать "через new", потому как указатель может указывать и на стековый объект.
Цитата Сообщение от alsav22 Посмотреть сообщение
На стеке объект будет храниться до окончания программы
Объект на стеке будет разрушен при выходе из области видимости, т.е. можно сделать так
C++
1
2
3
4
5
6
int main()
{
    {
        myclass ob;
    } // здесь объект ob будет разрушен и занимаемая им память будет считаться свободной
}
1
qazc
0 / 0 / 1
Регистрация: 01.11.2011
Сообщений: 26
29.08.2013, 18:59  [ТС] #4
Kastaneda, alsav22, спасибо!
0
alsav22
29.08.2013, 19:03
  #5

Не по теме:

Kastaneda, с исправлениями согласен, но (в качестве оправдания за неточности) я писал ответ на конкретный вопрос, по конкретному коду:

Цитата Сообщение от qazc Посмотреть сообщение
через указатель(как в данном случае) или обычым образом(Car myCar; ) в данной программе?

0
zer0mail
2374 / 2004 / 199
Регистрация: 03.07.2012
Сообщений: 7,197
Записей в блоге: 1
29.08.2013, 21:55 #6
Выделение динамической памяти происходит порциями и минимальная порция может быть на порядок больше, чем требуемая, а стек действует экономней и быстрее (но у него запасов меньше).

Хотя для данного примера это чисто теоретический нюанс.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
30.08.2013, 01:02 #7
Kastaneda
Это описано стандартном? Просто я читал что некоторые компиляторы вытягивают объявление переменной из блока.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
30.08.2013, 09:33 #8
Цитата Сообщение от kvadro Посмотреть сообщение
Это описано стандартном?
Это описано в любой книге для начинающих. Думаю в стандарте это тоже есть, просто мне сейчас лень искать.
0
kvadro
11 / 9 / 1
Регистрация: 12.03.2012
Сообщений: 127
30.08.2013, 12:03 #9
Это описано в любой книге для начинающих.
Я это прекрасно знаю, я говорю про то, что читал, что некоторые компиляторы вытягивают переменные из блока.
0
Kastaneda
Jesus loves me
Эксперт С++
4689 / 2893 / 236
Регистрация: 12.12.2009
Сообщений: 7,356
Записей в блоге: 2
Завершенные тесты: 1
30.08.2013, 12:17 #10
Заглянул в стандарт (правда 2003г.), вот
3.7.2
Local objects explicitly declared auto or register or not explicitly declared static or extern have
automatic storage duration. The storage for these objects lasts until the block in which they are created
exits.
и далее в 6.7
Variables with automatic storage duration (3.7.2) are initialized each time their declaration-statement is
executed. Variables with automatic storage duration declared in the block are destroyed on exit from the
block (6.6).
0
30.08.2013, 12:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.08.2013, 12:17
Привет! Вот еще темы с ответами:

Что происходит в памяти при объявлении переменной - C#
Простите за глупый вопрос, но он меня все же терзает))) Что происходит в памяти при объявлении переменной ( но без инициализации)....

Значение ячейки памяти через указатель - Visual C++
Хочу узнать значения ячеек памяти на определенном участке. Для этого пробую задать указателю адрес конкретной ячейки в памяти в hex виде,...

Не подскажите как сделать проверку через val в данной программе? - Turbo Pascal
const n=4; type m=array of integer; var a:m; i,j,p:integer; begin writeln('Введите элементы матрицы'); for i:=1 to n do ...

Найти ошибки в данной программе (известно что есть только 2 ошибки) - Assembler
У меня в модуле с програмирования задание: Найти ошибки в данной программе (известно что есть только 2 ошибки) .model small .data ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru