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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
#1

Преимущества указателя? - C++

20.01.2013, 00:22. Просмотров 2708. Ответов 31
Метки нет (Все метки)

Какая разница между?
C++
1
2
3
MyObject * object = new MyObject;
// и
MyObject object;
Какие преимущества дает использование указателя на объект с последующим выделением памяти под него по сравнению с просто объектом. (помимо того что использование указателя может давать утечки памяти)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 00:22
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Преимущества указателя? (C++):

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include <iostream> #include <cstdlib> #include <fstream> using namespace...

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Преимущества знания С++ - C++
привет всем. Подскажите пожалуйста какие преимущества дает знание языка С++.? Изучив С++ что я могу сделать в гоогле не особо разборчего...

31
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
20.01.2013, 02:17 #16
MrGluck, никак, в стандартных контейнерах все объекты хранятся в куче. Если Вы имеет ввиду сами объекты, то точно так же создаете объекты на стеке, берете их адрес, и пихаете в контейнер.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
20.01.2013, 02:30 #17
Меня интересует полиморфизм в стеке и реальный профит от его использования. Мб я действительно что то упускаю.
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
20.01.2013, 02:37 #18
MrGluck, плюс очевиден - скорость. Из минусов - уничтожение объекта при выходе из области видимости. В остальном ничем не отличается.
Если объектов немного и они нужны только для вычисления в функции, то лучше использовать стек, если же объектов много, или важно время их существование - тут уж только new.
1
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.01.2013, 02:40 #19
Цитата Сообщение от MrGluck Посмотреть сообщение
Меня интересует полиморфизм в стеке
Полиморфизм не зависит от того, где находится объект.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
20.01.2013, 02:56 #20
Можно пожалуйста пример, где используется полиморфизм, и размещение объектов в стеке даст действительную выгоду по сравнению с размещением в куче. Тогда, думаю, все вопросы отпадут.
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.01.2013, 03:01 #21
Цитата Сообщение от MrGluck Посмотреть сообщение
Тогда, думаю, все вопросы отпадут.
На оригинальный вопрос:
Цитата Сообщение от MrGluck Посмотреть сообщение
Как то же сделать через ссылки или в стеке?
Был дан ответ выше
Цитата Сообщение от MrGluck Посмотреть сообщение
и размещение объектов в стеке даст действительную выгоду по сравнению с размещением в куче
Это уже совсем другой вопрос действительной - имхо, никакой.
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 03:10  [ТС] #22
Цитата Сообщение от Toshkarik Посмотреть сообщение
MrGluck, плюс очевиден - скорость. Из минусов - уничтожение объекта при выходе из области видимости. В остальном ничем не отличается.
Если объектов немного и они нужны только для вычисления в функции, то лучше использовать стек, если же объектов много, или важно время их существование - тут уж только new.
Несмотря на кажущуюся простоту вопрос оказался, не из простых... Спасибо за споры в которых истина вынашивалась
0
MrGluck
Модератор
Эксперт CЭксперт С++
7490 / 4605 / 691
Регистрация: 29.11.2010
Сообщений: 12,589
20.01.2013, 03:34 #23
Vourhey, т.е просто
Цитата Сообщение от MrGluck Посмотреть сообщение
vbloodv, при создании указателя на базовый класс можно использовать полиморфизм
Надо заменить на
При использовании полиморфизма необходимо размещать объекты в куче. (необходимо == желательно). Или просто дописать в конце "без лишнего идиотизма". Т.е. как раз то, что и требовалось ТС
Цитата Сообщение от vbloodv Посмотреть сообщение
Какие преимущества дает использование указателя на объект с последующим выделением памяти под него по сравнению с просто объектом.
Но все же пример переделанный через размещение объектов в стеке (объекты разных классов в одной коллекции) был бы не лишним.
1
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.01.2013, 03:40 #24
Если упростить, что m - паблик и есть какой-нибудь виртуальный метод a()
C++
1
2
3
4
5
6
7
    B b;
    C c;
    D d;
    d.m["B"] = &b;
    d.m["C"] = &c;
    d.m["B"]->a();
    d.m["C"]->a();
Цитата Сообщение от MrGluck Посмотреть сообщение
При использовании полиморфизма необходимо размещать объекты в куче
Думаю, что вообще никогда не нужно затрагивать полиморфизм (как языковой механизм) с зависимыми от операционной системы вещами, такими как куча-стек. Они не связаны друг с другом никак.
1
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
20.01.2013, 05:33 #25
Цитата Сообщение от Vourhey Посмотреть сообщение
Думаю, что вообще никогда не нужно затрагивать полиморфизм (как языковой механизм) с зависимыми от операционной системы вещами, такими как куча-стек. Они не связаны друг с другом никак.
ну в теории то оно так (в стандарте c++ слова heap и stack применяются только относительно алгоритмов и контейнеров stl'a), но по жизни то их как называть?
Не dynamic/static storage же как в стандарте (с storage unit'ами)
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 14:54  [ТС] #26
Цитата Сообщение от Vourhey Посмотреть сообщение
Думаю, что вообще никогда не нужно затрагивать полиморфизм (как языковой механизм) с зависимыми от операционной системы вещами, такими как куча-стек. Они не связаны друг с другом никак.
Не совсем понятно что хотел сказать этим автор?
0
Vourhey
Почетный модератор
6486 / 2260 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.01.2013, 15:03 #27
Цитата Сообщение от vbloodv Посмотреть сообщение
Не совсем понятно что хотел сказать этим автор?
Стек и куча это понятия относящиеся к операционной системе. Полиморфизм - к языку. И я бы не стал связывать их вместе словами "нужно", "необходимо" и т. д..
0
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
21.01.2013, 03:53  [ТС] #28
Цитата Сообщение от MrGluck Посмотреть сообщение
Но все же пример переделанный через размещение объектов в стеке (объекты разных классов в одной коллекции) был бы не лишним.
Пожалуй он был бы очень очень полезен, даже если был полностью абстрактный !
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.01.2013, 10:24 #29
Цитата Сообщение от alex_x_x Посмотреть сообщение
Не dynamic/static storage же как в стандарте (с storage unit'ами)
Да просто не всего dynamic storage != куча. Есть же alloca(), например. Он хоть со своими закидонами, но динамически разместить полиморфный объект на стеке можно. Хотя, конечно, memory pool не особо медленнее стека, но не приводит к переполнению и весёлым эффектам при выходе из функции. Но ведь на стеке размещается именно нечто временное, на один вызов. Так что всё в порядке, кроме, разве что, переполнения буфера, если созданный объект своим хвостом вылазит за пределы стека. Вот только, к сожалению, 1) alloca() об этом молчит, 2) это никак не проверить заранее; поэтому-то и она и considered harmful.
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
21.01.2013, 13:25 #30
~OhMyGodSoLong~, что такое alloca?
memory pool тоже своеобразное решение, она требует значительно больше уразумений, чем просто выделение памяти на куче/в стеке
0
21.01.2013, 13:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2013, 13:25
Привет! Вот еще темы с ответами:

Преимущества указателей на void - C++
В чем преимущества указателей на void? Только в том, что не нужно лишний раз писать (type*) при преобразовании? Например вместо ...

объединить преимущества кодов - C++
Задание Написать программу. Пользователь вводит положительное или отрицательное число. Перевести число в 2-ую систему счисления и...

Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0] - C++
Задан массив из 3 указателей Bitmap, по адресу Bitmap необходимо записать 480*640 элементов из массива Bitmap. В последнем цикле for выдает...

QuickSort и MergeSort: недостатки и преимущества - C++
Добрый вечер! Qsort плоха тем, что в худшем случае работает за О(n^2). Mergesort стабильна и работает ВСЕГДА за n*log(n). Расскажите,...


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

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

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