![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Jeka178RUS |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 3.9.2012 Репутация: нет Всего: нет |
Чем же рекурсия так плоха? Накладные расходы на вызов функции, как мне кажется, не существенны (не берем в расчет критические отрасли, как контроллеры и пр.). Разве что отладка не удобна
|
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
ну если ты не знаешь, зачем нужна возможность ручного вызова конструктора и деструктора, то это не значит, что никому это не нужно. Хинт: попробуй реализовать std::vector::reserve() со всеми побочными явлениями без использования прямых вызовов.
|
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Преподаватели этим занимаются при подаче нового материала по теме "рекурсия", чтоб показать, что это вообще такое. Но когда ею пестрят учебные поделухи, это нормально. В реальных же прогах рекурсия должна быть там и только там, где она вытекает или из задачи, или из представления данных. Да и то бывает, что вместо рекурсии надо обратиться к математику, который объяснит, что матрицу экономнее привести к треугольному виду, а потом перемножить главную диагональ, чем считать определитель рекурсивным алгоритмом. На КМК есть целый отдел любителей рекурсии.
Добавлено @ 05:53 Один вызов? Или много? Кроме того, они зависят от параметров, при всего лишь одном тяжёлом параметре типа двумерный массив памяти при рекурсивном вычислении определителя хватило всего на 1237 вызовов на 6-ти уровнях. Да и не в расходах на вызов обычно дело. В случае, например, факториала рекурсия соответствует двум циклам вызовов и возвратов вместо одного. Добавлено @ 05:56 Явный вызов конструктора отлично заменяется присваиванием вспомогательного локального объекта, в котором напутать уже нельзя. А вот к чему приведёт двойной вызов конструктора для одного и того же динамического объёкта по указателю без тестов не разберёт и сам Страуструп. Это сообщение отредактировал(а) ТарасАтавин - 3.9.2013, 05:59 -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
и вообще. Языки С/С++ очень гибкие. Поэтому на них очень легко получается совершать ошибки. Хочешь не совершать? Пиши на Ada. |
||||
|
|||||
Jeka178RUS |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 85 Регистрация: 3.9.2012 Репутация: нет Всего: нет |
Замечательный пример "как не надо делать" я нашел в недрах Ericsson Labs: в одном файле утилиты для сжатия текстур 16 000 строк кода на С. Насколько нужно быть упоротым человеком чтобы так кодить?
Это сообщение отредактировал(а) Jeka178RUS - 3.9.2013, 12:38 |
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Затем, что забыл, что один раз уже вызвал.
Добавлено @ 11:26
Это сообщение отредактировал(а) ТарасАтавин - 5.9.2013, 11:27 -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Садись. Кол тебе! Бегом читать книжки по С++ для начинающих. Кстати, а ты вообще знаешь, как вызвать конструктор класса? А деструктор? И часто ты их вызываешь вручную? Кстати, следуя этой логике не нужны и new/delete, так как можно два раза выделить память. |
|||
|
||||
ТарасАтавин |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Сам читай. У меня 13 лет практического опыта.
Добавлено @ 14:11
Это сообщение отредактировал(а) ТарасАтавин - 5.9.2013, 14:16 -------------------- Не так всё плохо, как оно есть на самом деле. |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Опыт опыту рознь. Некоторые новички и то больше знают и умеют.
Ответ на вопрос о способах вызова конструктора и деструктора я так и не получил. Значит не знаешь. Тогда о чем вообще речь? Как ты можешь критиковать что-то, что ты вообще никогда не видел и уж тем более не задумывался о назначении. Это к тебе вопрос, а не ко мне. Так как это ты выразил мысль, что явный вызов конструкторов и деструкторов не нужен, так как может привести к повторной инициализации. Так как кто-то книжки читать не любит (видимо на основании 13-ти летного опыта), то справочно сообщаю, что явно вызвать конструктор класса можно только используя так называемый "размещающий new" (указанный пример кода показывает на сколько это нетривиальная операция, по которой даже нельзя сказать, что это вызов конструктора). А операция MyClass() не является вызовом конструктора в чистом виде - это фактически создание временного объекта связанное с вызовом указанного конструктора. |
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Добавлено через 3 минуты и 58 секунд "Это не вызов конструктора, а создание объекта и для этого вызов конструктора"? Ты серьёзно? Одно от другого ваще то не отделимо: объекты создаются только конструкторами, а конструкторы всегда создают объекты. Читай книги. -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Тарас, цепляй ObjectiveC. На Западе многие его юзают, кстати. По крайней мере в заказах постоянно вижу.
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
ТарасАтавин |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
О присваивании непроиниченному объекту? Ну ну. Я это практически делал. И наблюдал под дебагером, что именно у меня получалось.
Добавлено через 1 минуту и 28 секунд Си с классами вместо полноценного объектного языка? Сам цепляй эту полумеру. -------------------- Не так всё плохо, как оно есть на самом деле. |
|||
|
||||
bsa |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Да. Отличимо. Конструктор - это по сути функция, которая используется для инициализации объекта. А создание временной переменной - это выделение памяти в стеке, вызов конструктора и планирование вызова деструктора (кстати, все это делается неявно). То что синтаксис похож на вызов конструктора не говорит ни о чем - просто для удобства. Два раза проинициализировать один и тот же объект таким образом невозможно. Добавлено через 1 минуту и 5 секунд
Добавлено через 8 минут и 34 секунды Кстати, есть очень красивая реализация оператора присваивания с использованием создания временной переменной:
|
||||||
|
|||||||
ТарасАтавин |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 370 Регистрация: 26.8.2013 Репутация: нет Всего: нет |
Добавлено @ 08:08
1. Может вызываться не явно при входе в область видимости, в которой декларирован автоматический объект, при загрузке модуля, в котором декларирован статический объект и из оператора new. 2. Предназначена для начальной инициализации объекта, За назначением остальных функций следит автор, в том числе их можно предназначить для той же цели, что и конструктор. И что же остаётся от конструктора, если его пытаются вызвать явно? Placement new же вызывает конструкторы не явно. Кстати, пустые конструкторы инициализацией не занимаются, их назначение - соблюдение формального правила о создании объектов только через конструктор. Но почему-то
Это сообщение отредактировал(а) ТарасАтавин - 7.9.2013, 19:21 -------------------- Не так всё плохо, как оно есть на самом деле. |
||||||
|
|||||||
bsa |
|
||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Может написать отличия?
Я написал что-то противоречащее этому утверждению? Она вызывается не при входе в область видимости, а при инициализации переменной (объекта). Т.е. если переменная объявлена в конце блока, то конструктор она не вызовется сразу при входе.
Ты можешь сколько угодно тут разводить демагогию про явно и неявно, но placement new делает только одну операцию: вызов конструктора класса для инициализации объекта в указанной области памяти. И все! Поэтому я никогда бы не сказал, что он делает это неявно.
|
||||||||||
|
|||||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |