Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

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

Какие преимущества дают итераторы? - C++
Доброго времени суток! Подскажите пожалуйста, какие преимущества дают итераторы по сравнению с обычным обращением к элементу массива? ...

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

какие преимущества дает интерфейсное программирование? - C++
Дорогие программисты, во первых, хочу поздравить вас с Наступающим новым Годом! Я к вам обращаюсь с маленькой просьбой. Я никак не могу...

задача найти преимущества использования контенеров vec и set - C++
Пока не нашел особо больших кординальных преимуществ set'a . В учебнике предлагают решить такой пример: Вводим слово-исключение, если...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
20.01.2013, 00:26     Преимущества указателя? #2
Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject * object = new MyObject;
объект размещен в куче

Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject object;
объект размещен в стеке

стек имеет ограничение по размеру
например 100000000 объектов в стеке не разместишь программа рухнет
а в куче можно

А вообще что лучше Бельгия или Техас?
У каждого способа свои достоинства и недостатки
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 00:31  [ТС]     Преимущества указателя? #3
Цитата Сообщение от ValeryS Посмотреть сообщение
У каждого способа свои достоинства и недостатки
Про Бельг.... хм, про преимущество по подробнее пожалуйста. Хотя бы пару тройку прошу...
Evg
Эксперт CАвтор FAQ
17533 / 5771 / 369
Регистрация: 30.03.2009
Сообщений: 15,872
Записей в блоге: 26
20.01.2013, 00:34     Преимущества указателя? #4
Цитата Сообщение от vbloodv Посмотреть сообщение
Какие преимущества дает использование указателя на объект с последующим выделением памяти под него по сравнению с просто объектом
Никаких. Просто в каждом отдельно взятом случае более правильным решением будет то, либо другое.

Когда у тебя есть глобальные объекты в разных программных модулях, то у тебя нет никакой гарантии, что они построятся в том или ином порядке, а потому ты в конструкторе одного объекта не можешь закладываться на то, что другой объект уже проинициализирован. А вот когда ты объекты создаёшь динамически, ты ты сам чётко задаёшь порядок, в котором они будут созданы
MrGluck
Модератор
Эксперт CЭксперт С++
7158 / 4324 / 630
Регистрация: 29.11.2010
Сообщений: 11,745
20.01.2013, 00:36     Преимущества указателя? #5
vbloodv, при создании указателя на базовый класс можно использовать полиморфизм
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
20.01.2013, 00:42     Преимущества указателя? #6
Цитата Сообщение от vbloodv Посмотреть сообщение
преимущество по подробнее пожалуйста.
В стеке объект создается быстрее
А здесь
Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject * object = new MyObject
Тратится время на выделение памяти
да и удалять нужно ( то же время)
про то что в стек нельзя запихивать бесконечно я тебе писал
про порядок создания написал Evg


а чтобы понятнее было забудь про классы и подумай что лучше

C++
1
int * i=new int;
или
C++
1
int i
и то и другое имеет место быть

Добавлено через 35 секунд
Цитата Сообщение от MrGluck Посмотреть сообщение
vbloodv, при создании указателя на базовый класс можно использовать полиморфизм
А в стеке нельзя?
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
20.01.2013, 00:54     Преимущества указателя? #7
я вообще не понимаю из чего этот вопрос мог возникнуть. Вопрос стоит как? Зачем объявлять локальную переменную-указатель и в ней сохранять указатель на объект, созданный new, вместо того чтоб изначально объявить локальную переменную-объект? Ну так разные бывают обстоятельства.
Может полиморфизм нужен. И требуется по ходу программы хранить в этом указателе объекты разных классов.
Может динамический массив нужен и мы ещё не получили размер массива и не готовы его выделять.
Может нужен указатель на объект, возвращаемый из нашей текущей функции и мы не хотим, чтобы он исчез вместе с прочими локальными переменными.
Может нужны динамические списки/деревья и.т.п. Ты знаком с ними?

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
А в стеке нельзя?
не встречал такого. Ну разве что placement new может быть... не уверен.
а чем можно ещё заменить это:
base* ptr=new Derived();
если хотим на стеке?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 01:05     Преимущества указателя? #8
Kuzia domovenok, ссылкой.
C++
1
2
Derived a;
Base &b = a;
ValeryS
Модератор
6550 / 5016 / 463
Регистрация: 14.02.2011
Сообщений: 16,728
20.01.2013, 01:07     Преимущества указателя? #9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
не встречал такого.
В смысле?
такого не видел
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class A
{
public:
    int i;
    virtual void fnc(){printf("A\n");};
};
class B: public A
{
    virtual void fnc(){printf("B\n");};
};
 
 
 
void main() 
{
A a;
B b;
A *c;
c=&a;
c->fnc();
c=&b;
c->fnc();
}
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
20.01.2013, 01:08     Преимущества указателя? #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
Derived a;
Base &b = a;
А это тут при чём LOL
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 01:10     Преимущества указателя? #11
Kuzia domovenok, Вы спросили, чем заменить указатель на базовый класс в стеке, я ответил - ссылкой. Или я не корректно понял Ваш вопрос?
Kuzia domovenok
1890 / 1745 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
20.01.2013, 01:16     Преимущества указателя? #12
Я имел в виду довольно распространённое решение, например я могу написать такой игровой движок:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "SuperGameEngine.h"
int main(){
string s;
Game* app;
cout<<"Во что поиграть хотите?";
cin>>s;
switch(s){
  case "Doom 5": app=new Doom(5); break;
  case "Civilization 7": app=new Civilization(7); break;
  case "Halo 10": app=new Halo(10); break;
}
app->run();
return 0;
}
А вот зачем просто так заводить ссылку на объект, к которому мы и так можем обратиться, я не понял.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 01:23     Преимущества указателя? #13
Kuzia domovenok, это был всего лишь пример. Реальное же использование - функции:

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
25
26
27
class Base {
 public:
   virtual void h() const {
      std::cout << "base" << std::endl;
   }
};
 
class Derived : public Base {
 public:
   virtual void h() const {
      std::cout << "derived" << std::endl;
   }
};
 
int func( const Base &object ) {
   object.h();
}
 
int main() {
   Base a;
   Derived b;
 
   func( a );
   func( b );
 
   return 0;
}
В Вашем же примере не известно заранее, какой объект понадобится, поэтому логично использовать выделение памяти под объект в куче.
vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 01:47  [ТС]     Преимущества указателя? #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я вообще не понимаю из чего этот вопрос мог возникнуть. Вопрос стоит как?
Нет, вопрос стоит именно так как надо, не было понимания что где храниться и при разборе чужого кода, не мог понять чего хочет добиться автор...

Добавлено через 5 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Может динамический массив нужен и мы ещё не получили размер массива и не готовы его выделять.
Может нужен указатель на объект, возвращаемый из нашей текущей функции и мы не хотим, чтобы он исчез вместе с прочими локальными переменными.
Может нужны динамические списки/деревья и.т.п. Ты знаком с ними?
Нет, со всем этим знаком. По ответу ValeryS теперь понимаю что значит StackOVerFlow и как это делается))
MrGluck
Модератор
Эксперт CЭксперт С++
7158 / 4324 / 630
Регистрация: 29.11.2010
Сообщений: 11,745
20.01.2013, 02:11     Преимущества указателя? #15
А если потребуется хранить в коллекции объекты различных классов, имеющих один базовый?

Т.е.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class A
{
...
};
 
class B : public A
{
...
};
 
class C : public A
{
...
};
 
class D
{
...
std::map<std::string, A *> m;
};
Как то же сделать через ссылки или в стеке?
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 02:17     Преимущества указателя? #16
MrGluck, никак, в стандартных контейнерах все объекты хранятся в куче. Если Вы имеет ввиду сами объекты, то точно так же создаете объекты на стеке, берете их адрес, и пихаете в контейнер.
MrGluck
Модератор
Эксперт CЭксперт С++
7158 / 4324 / 630
Регистрация: 29.11.2010
Сообщений: 11,745
20.01.2013, 02:30     Преимущества указателя? #17
Меня интересует полиморфизм в стеке и реальный профит от его использования. Мб я действительно что то упускаю.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.01.2013, 02:37     Преимущества указателя? #18
MrGluck, плюс очевиден - скорость. Из минусов - уничтожение объекта при выходе из области видимости. В остальном ничем не отличается.
Если объектов немного и они нужны только для вычисления в функции, то лучше использовать стек, если же объектов много, или важно время их существование - тут уж только new.
Vourhey
Почетный модератор
6477 / 2252 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
20.01.2013, 02:40     Преимущества указателя? #19
Цитата Сообщение от MrGluck Посмотреть сообщение
Меня интересует полиморфизм в стеке
Полиморфизм не зависит от того, где находится объект.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 02:56     Преимущества указателя?
Еще ссылки по теме:

Преимущества и недостатки при реализации стека, очереди и дека через дин. массива - C++
Доброго времени суток! 1) Назовите преимущества и недостатки реализации очереди с помощью динамического массива. 2) Назовите...

Память. Стек или куча - есть ли преимущества одного кода над другим? - C++
Здравствуйте, хотел спросить в чем различия. В чем тут недостатки и преимущества разных способов? Apple apple(); и Apple *apple = new...

В чем преимущества new и delete и могут ли они действительно заменить функции calloc, malloc, free, realloc? - C++
Язык программирования C поддерживает функции динамического управления пямятью: calloc, malloc, free, realloc - которые неподдерживают...

Компиляторы. Какие преимущества между "кнопкой" и консолью? - C++
В наличии два компилятора: от vs и intel с оболочками и консоли. Какие преимущества между &quot;кнопкой&quot; и консолью?

Удаление указателя - C++
Доброго времени суток! Возник вопрос: безопасно ли таким способом удалять указатели? std::vector&lt;MyClass*&gt; vec; //создание ...


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

Или воспользуйтесь поиском по форуму:
MrGluck
Модератор
Эксперт CЭксперт С++
7158 / 4324 / 630
Регистрация: 29.11.2010
Сообщений: 11,745
20.01.2013, 02:56     Преимущества указателя? #20
Можно пожалуйста пример, где используется полиморфизм, и размещение объектов в стеке даст действительную выгоду по сравнению с размещением в куче. Тогда, думаю, все вопросы отпадут.
Yandex
Объявления
20.01.2013, 02:56     Преимущества указателя?
Ответ Создать тему
Опции темы

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