-
Я тоже честно говоря не понял конкретный пример. Но идея понятна.
-
> Kerk © (26.05.16 19:48) [100]
Идея-то понятно, но если бы был Range Check Error с переменной цикла, это был бы большой фейл.
var
I: 0..9;
begin
for I := 0 to 9 do // Нет выхода за границы диапазона, не будет и исключения.
;
end;
-
А ведь и верно - в Delphi ошибки нет. Но в Turbo Pascal 5.5 точно была.
-
Читал ветку, читал. Но так и не понял, о чём копья ломаются.
Господа, какую проблему решаем?
-
> Юрий Зотов © (26.05.16 19:01) [95]
> Вход в цикл минуя его заголовок - запросто.
Это в PL как раз нельзя было.
Если, конечно, память не обманывает.
-
Так, начиная с [72] - всё быстро просмотрел, местами даже относительно внимательно. Похоже, пока что, добавить мне нечего.
ПС. А кто это там так боянисто вбросил? И зачем? - вот главный вопрос.:) А вы тут про метки и прочие агрегаты.:)
Если что - я тут уже давно под одним ником.
-
> Плохиш © (26.05.16 20:17) [103]
> Читал ветку, читал. Но так и не понял, о чём копья ломаются.
> Господа, какую проблему решаем?
А никакую, просто общаемся. Редкий случай, когда разговор на холиварную тему протекает в нормальном тоне.
-
> Kerk © (26.05.16 15:00) [88]
> Ну так да. Где-то в эту сторону языки программирования и
> развиваются в основном. Больше типизации, меньше прямой
> работы с памятью. И это хорошо
Насчет типизации соглашусь. Насчет работы с памятью: сборщики мусора, по-моему, зло злейшее. Жаль что эта мода врядли скоро пройдет. Думаю можно найти приемлемый способ убивать ненужные объекты сразу после выхода из зоны видимости и не использовать сборщик мусора.
-
> DayGaykin © (26.05.16 22:16) [107]
> можно найти приемлемый способ убивать
> ненужные объекты сразу после выхода из зоны видимости и
> не использовать сборщик мусора.
Его и искать не надо, он уже есть: обнулился счетчик ссылок - убили объект.
Но не все так просто. Если память, которую занимал объект просто возвратить в хип, то довольно быстро наступит такая фрагментация памяти, что получим OutOfMemory, хотя свободной памяти - до фига и больше. Надо проводить дефрагментацию паамяти, а если делать ее на каждое удаление объекта, то будет слишком накладно.
-
Кстати, интересная штука открылась (в java). Есть там метод freeMemory, который, если верить документации, просто возвращает кол-во свободной памяти в байтах. И был у меня кусок программы, который загружал дисковый файл и по нему строил в памяти список неких объектов.
Так вот - если этот файл слишком большой, то возникало то самое OutOfMemory. Тогда при отладке перед и после этого куска я вставил freeMemory с выводом в консоль - для контроля.
Ошибка тут же исчезла. Предполагаю (хотя в документации это не сказано), что внутри freeMemory сначала происходит принудительная сборка мусора и дефрагментация памяти, а уж потом возвращается ее количество.
Позже я использовал этот прием и в других похожих местах. Результат всегда был один - ошибка OutOfMemory исчезала.
-
Фатальный недостаток счетчика ссылок - циклические ссылки. Их конечно можно вручную разрывать, но не всегда просто отследить.
-
> Юрий Зотов © (26.05.16 20:05) [102]
>
> А ведь и верно - в Delphi ошибки нет. Но в Turbo Pascal
> 5.5 точно была.
>
Юр, не было. TP 5.5 у меня под рукой. До сих пор использую. Пришлось даже VMWare установить.
Точнее, если и была, то не в совсем таком коде. Да после итерации счетчик цикла сначала увеличивается, а затем проверяется условие цикла. Но это не должно приводить к ошибке.
-
> Германн © (27.05.16 01:10) [111]
Поставь опции (или птички):
{R+}
{Q+}
{O-}
и сбилди проект.
-
> Kerk © (27.05.16 00:41) [110]
> Фатальный недостаток счетчика ссылок - циклические ссылки.
>
ну в новой версии сделали weak reference, правда это само по себе несколько портит концепцию подсчета ссылок.
-
Да, это самая важная фича со времен дженериков по-моему :)
-
Самое интересное, что в "Модула-2" GOTO убрали. :)
-
> А если это будет TPersonRec то менять мы сможем только запись
> целиком, т.е.
Это следствие дизайна дельфи, который гласит: "за любое удобство нужно платить производительностью".
В плюсах, и кстати в следующей версии C#, то что ты хочешь можно и для структур со свойствами сделать.
-
> Юрий Зотов © (27.05.16 05:07) [112]
>
> > Германн © (27.05.16 01:10) [111]
>
> Поставь опции (или птички):
> {R+}
> {Q+}
> {O-}
> и сбилди проект.
>
Юр. Поставил/снял птички/галочки R и O и сбилдил проект. Птичку/галочку Q не нашел в Options. Поставил в коде явно.
program Test;
var i : 0..9;
begin
for i:=0 to 9 do
end.
Никаких сообщений об ошибках не получил.
-
Ну т.е. {$Q+}.
-
> Юрий Зотов © (26.05.16 23:09) [109]
> Результат всегда был один - ошибка OutOfMemory исчезала.
Мне кажется, если в программе возникает OutOfMemory - это повод задуматься об алгоритмах и архитектуре программы, а не добавлять недокументированные костыли.
Может я конечно не прав и в мире Java все не так.