Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
http://code.google.com/p/forget3d/
Во первых, умиляет умение людей взяв современный супернавороченый удобный автомат, вместо того чтоб нажать на курок и выстрелить в противника, взять этот автомат наперевес как дубинку, и идти им пиздить противника по голове. Я о сишке, слегка прикрытой крестами.
И во вторых, этот код при недостатке памяти просто нифига не делает, что чревато непонятками - вроде и повертел модель, вроде и подвинул, а оно никак не вертится и не двигается.
>этот код при недостатке памяти просто нифига не делает, что чревато непонятками
Недостаток памяти всегда чем-то чреват. И неважно где это на стеке или в куче.
Edit: впрочем kipar выше об этом уже написал.
Ну если вовремя узнать о нехватке памяти, можно как то пытаться восстановить ситуацию, например, освободить память, занятую какими то не критичными данными.
Традиционно это делается через коллбэк std::set_new_handler(), правда, для этого нужно использовать крестовый new, а не malloc, и следовать довольно нетривиальному протоколу.
> чистить все std::weak_ptr
А чего их чистить? Они вроде сами очищаются при уничтожении последнего shared_ptr, GC ждать не надо.
> Кстати, соглашусь. malloc() как раз и существует для случаев, когда нужно выделить неинициализированную память.
Они так говорят, как-будто new для примитивов что-то инициализирует.
Ну вот не читается у меня файл, оборвался сокет, не спарсился XML - это всё ненормальные ветки, они не исполняются когда всё ок. Вот для них такие исключения идеальны, и код будет работать чуть быстрее, чем с if'ами.
А всё подряд на исключениях делать глупо, я не спорю. Если ветки равновероятны - какая ж это исключительная ситуация?
Ты так говоришь, как будто актуально бесконечные списки реально кому-то нужны. Всегда где-нибудь есть какой-нибудь take 15, делающий бесконечный список конечным.
> реально кому-то нужны
С ними работать удобней - не надо базис индукции писать.
Не помню, выкладывал ли я МНК, в котором строится бесконечная система уравнений с бесконечным числом переменных, а потом прямо так и приводится к треугольному виду. К сожалению последний шаг в бесконечности не получился ;(
Разумеется, промежуточные шаги трансформируют список как бесконечный. Но в конечном приложении, которое использует функцию-генератор, будет take или filter + head, как подсказывает \pi.
Впрочем, я понял тебя - ты имеешь в виду функции, которые принципиально должны работать лишь с бесконечными списками (вроде преобразований эйлера для бесконечных рядов). Там исключение будет где-нибудь в head пустого списка 🙂
samples = [(1,1), (2, 3), (3, 4), (4, 4), (5,1), (6, -1), (7, -5), (8, -1), (9, 2)]
-- Бесконечная система уравнений для МНК
system s = zip (matrix s) (column s) where
matrix = iterate tail . foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) 1)
column = foldr1 (zipWith (+)) . map (\(x,y) -> iterate (*x) y)
-- Сведение бесконечной системы к треугольному виду (первый шаг гаусса)
triangle (eq:eqs) = (eq : triangle (map (sub eq) eqs)) where
sub eq1@(a1:as, ae) eq2@(b1:bs, be) = (zipWith f as bs, f ae be) where
f a b = b - a * b1 / a1
-- Вычисление иксов (второй шаг гаусса)
calcX n = foldr calc [] . take n where
calc (a:as, b) xs = ((b - sum (zipWith (*) as xs)) / a : xs)
-- метод наименьших квадратов
mnk n = reverse . calcX n . triangle . system
main = print $ mnk 5 samples
>В gcc - только когда бросаются. В остальное время они вообще никак не влияют, помимо раздувания бинарника
Эээ. Ну вообще-то всё зависит от выбранной схемы EH.
dwarf - без переголовы.
sjlj немного-таки просаживает пирфоманс, даже если исключение не бросается!
>А схема с sjlj - пиздец лютый
Дадад. Когда будешь линковать с кодом скомпиленным с другим EH или вообще без инфы о unwinding (сишка) тогда поймешь ценность sjlj.
>Когда будешь линковать с кодом скомпиленным с другим EH или вообще без инфы о unwinding (сишка) тогда поймешь ценность sjlj.
Эээ, а как sjlj тут поможет?
>Кстати как там у dwarfa c 64-битными платформами?
Под юниксами есть, про венду не знаю. На IA64, кстати, dwarf -- стандартный способ делать EH.
Ну, при желании, можно и дворфов поюзать. У мингв, емнип, даже соответствующая сборочка есть. Но там они сразу предупредили - исключения через коллбеки не пролезут.
И в свете этого комментарий приобретает новый смысл: вместо того, чтобы делать через ту жопу, через которую делает большинство, говнокодер нашёл новую.
Сразу не обратил внимание.
Здесь принимается что sizeof(GLfloat) == sizeof(float), что логически вроде и обосновано, хотя стандарт этого не обещает. Интересно, есть ли системы где это не так?
> Здесь принимается что sizeof(GLfloat) == sizeof(float)
Нет. Мы ведь не видим определений m_position и m_rotate. Если там просто float - то всё норм...
Недостаток памяти всегда чем-то чреват. И неважно где это на стеке или в куче.
Edit: впрочем kipar выше об этом уже написал.
И если не хватает чистить все booststd::weak_ptr и кеши?
> чистить все std::weak_ptr
А чего их чистить? Они вроде сами очищаются при уничтожении последнего shared_ptr, GC ждать не надо.
Так нам надо их почистить не на последней ссылке, а по нехватке памяти.
Юзать new, оно кидает исключение.
Ваш кэп.
Можно линк?
Они так говорят, как-будто new для примитивов что-то инициализирует.
А если ты напишешь pod без дефолтного конструктора - там что new, что malloc нихера не будут инициализировать:
std::auto_ptr + malloc - не надо так
всё выделенное malloc-ом должно быть освобождено как free, а не delete
Я знаю, что его нельзя юзать для массивов.
В шестом говнобилдере он не deprecated.
Но зачем?
Есть такое слово - legacy.
operator new(size_t), не?
Или что-нибудь вродеПоскольку с исключениями работать не умеют
В gcc - только когда бросаются. В остальное время они вообще никак не влияют, помимо раздувания бинарника
Там код с try/catch даже может работать быстрее кода с ифами, если исключение не бросается - на успешном пути не будет лишних проверок и переходов.
А так - да, Мне кажется так в любом языке - если исключения не выпадают то возвратов тупо нет.
Ну вот не читается у меня файл, оборвался сокет, не спарсился XML - это всё ненормальные ветки, они не исполняются когда всё ок. Вот для них такие исключения идеальны, и код будет работать чуть быстрее, чем с if'ами.
А всё подряд на исключениях делать глупо, я не спорю. Если ветки равновероятны - какая ж это исключительная ситуация?
while (!solution_found())
С ними работать удобней - не надо базис индукции писать.
Не помню, выкладывал ли я МНК, в котором строится бесконечная система уравнений с бесконечным числом переменных, а потом прямо так и приводится к треугольному виду. К сожалению последний шаг в бесконечности не получился ;(
Впрочем, я понял тебя - ты имеешь в виду функции, которые принципиально должны работать лишь с бесконечными списками (вроде преобразований эйлера для бесконечных рядов). Там исключение будет где-нибудь в head пустого списка 🙂
ХБЗ.
Химическо-биологическая защита?
Хлопчатобумажный зипун?
Hemoglobin subunit zeta?
Handwerksbildungszentrum?
Hemorrhagic Bowel Syndrom?
Эээ. Ну вообще-то всё зависит от выбранной схемы EH.
dwarf - без переголовы.
sjlj немного-таки просаживает пирфоманс, даже если исключение не бросается!
Дадад. Когда будешь линковать с кодом скомпиленным с другим EH или вообще без инфы о unwinding (сишка) тогда поймешь ценность sjlj.
Кстати как там у dwarfa c 64-битными платформами?
fxd
unwind через область с чужеродным EH - в любом случае игра на грани фола.
Эээ, а как sjlj тут поможет?
>Кстати как там у dwarfa c 64-битными платформами?
Под юниксами есть, про венду не знаю. На IA64, кстати, dwarf -- стандартный способ делать EH.
Через калбеки winApi dw2-исключение не пройдёт, sjlj - со свистом.
Борманд выше правильно поправляет: под виндой sjlj неизбежен. sjlj - совместимость, dw2 - производительность. Трейдофф.
Здесь принимается что sizeof(GLfloat) == sizeof(float), что логически вроде и обосновано, хотя стандарт этого не обещает. Интересно, есть ли системы где это не так?
Нет. Мы ведь не видим определений m_position и m_rotate. Если там просто float - то всё норм...