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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.89
vbloodv
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 00:22     Преимущества указателя? #1
Какая разница между?
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++ Перезаписать память начиная с указателя Bitmap[1] элементами начиная с указателя Bitmap[0]
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... C++
C++ объединить преимущества кодов
C++ задача найти преимущества использования контенеров vec и set
C++ какие преимущества дает интерфейсное программирование?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
20.01.2013, 00:26     Преимущества указателя? #2
Цитата Сообщение от vbloodv Посмотреть сообщение
MyObject * object = new MyObject;
объект размещен в куче

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

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

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

Когда у тебя есть глобальные объекты в разных программных модулях, то у тебя нет никакой гарантии, что они построятся в том или ином порядке, а потому ты в конструкторе одного объекта не можешь закладываться на то, что другой объект уже проинициализирован. А вот когда ты объекты создаёшь динамически, ты ты сам чётко задаёшь порядок, в котором они будут созданы
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
20.01.2013, 00:36     Преимущества указателя? #5
vbloodv, при создании указателя на базовый класс можно использовать полиморфизм
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.01.2013, 00:54     Преимущества указателя? #7
я вообще не понимаю из чего этот вопрос мог возникнуть. Вопрос стоит как? Зачем объявлять локальную переменную-указатель и в ней сохранять указатель на объект, созданный new, вместо того чтоб изначально объявить локальную переменную-объект? Ну так разные бывают обстоятельства.
Может полиморфизм нужен. И требуется по ходу программы хранить в этом указателе объекты разных классов.
Может динамический массив нужен и мы ещё не получили размер массива и не готовы его выделять.
Может нужен указатель на объект, возвращаемый из нашей текущей функции и мы не хотим, чтобы он исчез вместе с прочими локальными переменными.
Может нужны динамические списки/деревья и.т.п. Ты знаком с ними?

Добавлено через 2 минуты
Цитата Сообщение от ValeryS Посмотреть сообщение
А в стеке нельзя?
не встречал такого. Ну разве что placement new может быть... не уверен.
а чем можно ещё заменить это:
base* ptr=new Derived();
если хотим на стеке?
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.01.2013, 01:05     Преимущества указателя? #8
Kuzia domovenok, ссылкой.
C++
1
2
Derived a;
Base &b = a;
ValeryS
Модератор
6373 / 4839 / 440
Регистрация: 14.02.2011
Сообщений: 16,038
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
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.01.2013, 01:08     Преимущества указателя? #10
Цитата Сообщение от Toshkarik Посмотреть сообщение
Derived a;
Base &b = a;
А это тут при чём LOL
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.01.2013, 01:10     Преимущества указателя? #11
Kuzia domovenok, Вы спросили, чем заменить указатель на базовый класс в стеке, я ответил - ссылкой. Или я не корректно понял Ваш вопрос?
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 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
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
 Аватар для vbloodv
22 / 22 / 0
Регистрация: 15.12.2012
Сообщений: 314
20.01.2013, 01:47  [ТС]     Преимущества указателя? #14
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
я вообще не понимаю из чего этот вопрос мог возникнуть. Вопрос стоит как?
Нет, вопрос стоит именно так как надо, не было понимания что где храниться и при разборе чужого кода, не мог понять чего хочет добиться автор...

Добавлено через 5 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Может динамический массив нужен и мы ещё не получили размер массива и не готовы его выделять.
Может нужен указатель на объект, возвращаемый из нашей текущей функции и мы не хотим, чтобы он исчез вместе с прочими локальными переменными.
Может нужны динамические списки/деревья и.т.п. Ты знаком с ними?
Нет, со всем этим знаком. По ответу ValeryS теперь понимаю что значит StackOVerFlow и как это делается))
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
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
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.01.2013, 02:17     Преимущества указателя? #16
MrGluck, никак, в стандартных контейнерах все объекты хранятся в куче. Если Вы имеет ввиду сами объекты, то точно так же создаете объекты на стеке, берете их адрес, и пихаете в контейнер.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
20.01.2013, 02:30     Преимущества указателя? #17
Меня интересует полиморфизм в стеке и реальный профит от его использования. Мб я действительно что то упускаю.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 1
20.01.2013, 02:37     Преимущества указателя? #18
MrGluck, плюс очевиден - скорость. Из минусов - уничтожение объекта при выходе из области видимости. В остальном ничем не отличается.
Если объектов немного и они нужны только для вычисления в функции, то лучше использовать стек, если же объектов много, или важно время их существование - тут уж только new.
Vourhey
Почетный модератор
6468 / 2243 / 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++ Преимущества знания С++
QUICKsort и MERGEsort недостатки и преимущества C++
C++ Память. Стек или куча - есть ли преимущества одного кода над другим?

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4919 / 2662 / 243
Регистрация: 29.11.2010
Сообщений: 7,397
20.01.2013, 02:56     Преимущества указателя? #20
Можно пожалуйста пример, где используется полиморфизм, и размещение объектов в стеке даст действительную выгоду по сравнению с размещением в куче. Тогда, думаю, все вопросы отпадут.
Yandex
Объявления
20.01.2013, 02:56     Преимущества указателя?
Ответ Создать тему
Опции темы

Текущее время: 15:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru