Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Для чего использовать оператор new 
V
    Опции темы
n199a
Дата 28.5.2013, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Искал информацию про оператор new про который не так уж и много расписано. 

Если размер строки матрицы известен, а неизвестно только количество строк, можно поступить так: ввести новый тип данных – строка матрицы. Когда количество строк станет известно, с помощью оператора new выделяем массив таких данных.
Есть код:
Код

typedef int row[7]
main()
{
int N;
row *A;
printf("Введите число строк: ");
scanf("%d", &N);
A = new row[N];

delete A;
}


Описание:
Код

typedef int row[7]

Новое имя типа переменной (int) будет row.
Массив "row" типа "int", который содержит 7 элементов.
Код

row *A;

Создается указатель "А" с типом int.
Код

A = new row[N];

Оператор "new"
Указатель "А" равняется массиву с типом "row" (int) с размером массива в 7 элементов.

К этой задаче:
У нас есть массив из ? строк и строка содержит 7 элементов (т.е. длина строки равна 7 элементов).
Т.е. A[?][7]
Становится известно, что у нас 3 строки.
Получается, что, мы создаем НОВЫЙ двумерный массив, например Mass[3][7], вместо того чтобы занести в массив A кол-во строк?

Оператор new используется для сокращения кода и времени его написания? smile 
Для чего использовать оператор new?

PM MAIL   Вверх
Dem_max
Дата 28.5.2013, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Цитата

Для чего использовать оператор new?

Чтобы выделить память под "объект" и уничтожить эту память если она не нужна, а обычные объекты создаются на стеке.

Это сообщение отредактировал(а) Dem_max - 28.5.2013, 18:53


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
n199a
Дата 28.5.2013, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(Dem_max @  28.5.2013,  18:49 Найти цитируемый пост)
Чтобы выделить память под "объект" и уничтожить эту память если она не нужна, так как обычные объекты создаются на стеке. 

Так, на сколько я понял, вся разница лишь в "месте".
new - для выделения объема для данных в памяти (куча) (ключевое слово - память).
a = 5 - помещает размер байтов в стек(ключевое слово - стек).
Следовательно, разница лишь в скорости получения этих данных из стека и кучи соответственно?
По другому - если создается большой проект, то в целях оптимизации скорости выполнения надо использовать данные из кучи, так?
Из кучи данные быстрее получают, чем из стека.
В стеке хранятся локальные переменные. Тогда глобальные в куче?

При работе со стеком он заполняется, если работу закончили - освободился. Т.е. он как бы расширяется (до определенных размеров) или сужается?
Про память. Допусти память - это объем (бочка), фиксированный размер. В бочку можно поставить кружку (определенный объем памяти) границы которой уже не смогут сужаться/расширяться.
Я правильно понял?  smile 


Это сообщение отредактировал(а) n199a - 28.5.2013, 19:01
PM MAIL   Вверх
Dem_max
Дата 28.5.2013, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 4
Всего: 39



Если у тебя очень много данных то конечно выделять в куче


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 28.5.2013, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(n199a @  28.5.2013,  19:56 Найти цитируемый пост)
По другому - если создается большой проект, то в целях оптимизации скорости выполнения надо использовать данные из кучи, так?

Оптимизация здесь второе дело.

Данные "на стеке" существуют только в области видимости, данные "на куче" существуют, пока выделенную под них память явно не освободят:
Код

  {
    ...
    T t; // вызов конструктора, данные "на стеке"
    ...
          // вызов деструктора, данные разрушаются
  }

  {
    T *t = new T; // данные "на куче"
    ...
    return t; // данные не разрушаются
  }



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
n199a
Дата 28.5.2013, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(feodorv @  28.5.2013,  19:12 Найти цитируемый пост)
Данные "на стеке" существуют только в области видимости

В смысле только для данной программы?
А если данные в куче, то и другие программы могут "видеть" эти данные?

P.S. Про разрушаемость данных уже понятно.

Это сообщение отредактировал(а) n199a - 28.5.2013, 19:52
PM MAIL   Вверх
Alexeis
Дата 28.5.2013, 20:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(feodorv @  28.5.2013,  20:12 Найти цитируемый пост)
Данные "на стеке" существуют только в области видимости, данные "на куче" существуют, пока выделенную под них память явно не освободят:

  Я бы сказал еще более обще. Данные в стеке уничтожаются в порядке обратном их созданию, а данные в куче уничтожаются в произвольном порядке. А уничтожаются при выходе из области видимости блока все локальные переменные созданные в блоке. Область видимости относиться именно к блоку, а не к стеку. Стек имеет лишь косвенную связь областью видимости, потому что локальные переменные создаются в стеке. Кстати, время жизни локальной переменной может быть продлено даже по выходу из блока, если на нее существует константная ссылка. Очевидно, что такие переменные хотя и создаются в стеке, но уже не будут локальными в смысле фактического размещения. А уничтожаться такая переменная все равно будет в порядке обратном ее фактического создания ввиду того, что создали ее в стеке.

Добавлено через 8 минут и 20 секунд
Цитата(n199a @  28.5.2013,  20:44 Найти цитируемый пост)
А если данные в куче, то и другие программы могут "видеть" эти данные?

  С++ ничего не знает про "другие программы". Есть адресное пространство. Программа может попытаться прочитать и записать данные по любым адресам. Если вдруг там окажутся данные чужой программы, то тогда да. У обычных программ под Windows или Linux в адресном пространстве нет данных чужих программ. У драйверов есть.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
rodnover
Дата 31.5.2013, 05:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 223
Регистрация: 7.4.2009

Репутация: 2
Всего: 10



А самое главное, что стек не резиновый и в нем массив на 2 Гб не так-то просто (и самое главное не нужно) выделить. И на сколько я помню быстрее-то, как раз стековые переменные.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
Alexeis
Дата 31.5.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 4
Всего: 459



Цитата(rodnover @  31.5.2013,  06:06 Найти цитируемый пост)
А самое главное, что стек не резиновый и в нем массив на 2 Гб не так-то просто (и самое главное не нужно) выделить.

  Резиновый или нет зависит от настроек компилятора и возможностей ОС. Под виндой резиновый. Если выделить большой массив в стеке, в одной из функций, в которых программа пребывает длительное время, то ничего страшного не будет. Но вообще да, большой массив предполагает длительное время жизни. Длительное время жизни чаще всего обеспечивает куча, поскольку освобождение памяти можно осуществлять в произвольное время.  Ассоциировать стек с малым временем жизни это инерция мышления. Стек это лишь способ управления порядком создания и удаления данных. Время жизни определяет логика программы. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0823 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.