![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
n199a |
|
||||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.11.2011 Репутация: нет Всего: нет |
Искал информацию про оператор new про который не так уж и много расписано.
Если размер строки матрицы известен, а неизвестно только количество строк, можно поступить так: ввести новый тип данных – строка матрицы. Когда количество строк станет известно, с помощью оператора new выделяем массив таких данных. Есть код:
Описание:
Новое имя типа переменной (int) будет row. Массив "row" типа "int", который содержит 7 элементов.
Создается указатель "А" с типом int.
Оператор "new" Указатель "А" равняется массиву с типом "row" (int) с размером массива в 7 элементов. К этой задаче: У нас есть массив из ? строк и строка содержит 7 элементов (т.е. длина строки равна 7 элементов). Т.е. A[?][7] Становится известно, что у нас 3 строки. Получается, что, мы создаем НОВЫЙ двумерный массив, например Mass[3][7], вместо того чтобы занести в массив A кол-во строк? Оператор new используется для сокращения кода и времени его написания? ![]() Для чего использовать оператор new? |
||||||||
|
|||||||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Чтобы выделить память под "объект" и уничтожить эту память если она не нужна, а обычные объекты создаются на стеке. Это сообщение отредактировал(а) Dem_max - 28.5.2013, 18:53 -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
n199a |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.11.2011 Репутация: нет Всего: нет |
Так, на сколько я понял, вся разница лишь в "месте". new - для выделения объема для данных в памяти (куча) (ключевое слово - память). a = 5 - помещает размер байтов в стек(ключевое слово - стек). Следовательно, разница лишь в скорости получения этих данных из стека и кучи соответственно? По другому - если создается большой проект, то в целях оптимизации скорости выполнения надо использовать данные из кучи, так? Из кучи данные быстрее получают, чем из стека. В стеке хранятся локальные переменные. Тогда глобальные в куче? При работе со стеком он заполняется, если работу закончили - освободился. Т.е. он как бы расширяется (до определенных размеров) или сужается? Про память. Допусти память - это объем (бочка), фиксированный размер. В бочку можно поставить кружку (определенный объем памяти) границы которой уже не смогут сужаться/расширяться. Я правильно понял? ![]() Это сообщение отредактировал(а) n199a - 28.5.2013, 19:01 |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 4 Всего: 39 |
Если у тебя очень много данных то конечно выделять в куче
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Оптимизация здесь второе дело. Данные "на стеке" существуют только в области видимости, данные "на куче" существуют, пока выделенную под них память явно не освободят:
-------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
n199a |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 129 Регистрация: 17.11.2011 Репутация: нет Всего: нет |
||||
|
||||
Alexeis |
|
||||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Я бы сказал еще более обще. Данные в стеке уничтожаются в порядке обратном их созданию, а данные в куче уничтожаются в произвольном порядке. А уничтожаются при выходе из области видимости блока все локальные переменные созданные в блоке. Область видимости относиться именно к блоку, а не к стеку. Стек имеет лишь косвенную связь областью видимости, потому что локальные переменные создаются в стеке. Кстати, время жизни локальной переменной может быть продлено даже по выходу из блока, если на нее существует константная ссылка. Очевидно, что такие переменные хотя и создаются в стеке, но уже не будут локальными в смысле фактического размещения. А уничтожаться такая переменная все равно будет в порядке обратном ее фактического создания ввиду того, что создали ее в стеке. Добавлено через 8 минут и 20 секунд
С++ ничего не знает про "другие программы". Есть адресное пространство. Программа может попытаться прочитать и записать данные по любым адресам. Если вдруг там окажутся данные чужой программы, то тогда да. У обычных программ под Windows или Linux в адресном пространстве нет данных чужих программ. У драйверов есть. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
||||
|
|||||
rodnover |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 223 Регистрация: 7.4.2009 Репутация: 2 Всего: 10 |
А самое главное, что стек не резиновый и в нем массив на 2 Гб не так-то просто (и самое главное не нужно) выделить. И на сколько я помню быстрее-то, как раз стековые переменные.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
Alexeis |
|
|||
![]() Амеба ![]() Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Резиновый или нет зависит от настроек компилятора и возможностей ОС. Под виндой резиновый. Если выделить большой массив в стеке, в одной из функций, в которых программа пребывает длительное время, то ничего страшного не будет. Но вообще да, большой массив предполагает длительное время жизни. Длительное время жизни чаще всего обеспечивает куча, поскольку освобождение памяти можно осуществлять в произвольное время. Ассоциировать стек с малым временем жизни это инерция мышления. Стек это лишь способ управления порядком создания и удаления данных. Время жизни определяет логика программы. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |