malloc и использование динамической памяти

Sharp

Ибо с самого начала надо учиться делать правильно.
А то потом будет труднее переучиваться.
Вот так люди привыкают, что все всегда работает, что malloc и fopen всегда возвращает не NULL...
А если вдруг ихние программы попытаться запустить на другой машине, с другой архитектурой, с другой OC, то тогда можно выяснить, что и у int-а бывает разный размер, что функции getch просто нету, ровно как и библиотеки <conio.h>

mira-bella

Ибо с самого начала надо учиться делать правильно.
А то потом будет труднее переучиваться.
Вот так люди привыкают, что все всегда работает, что malloc и fopen всегда возвращает не NULL...
А если вдруг ихние программы попытаться запустить на другой машине, с другой архитектурой, с другой OC, то тогда можно выяснить, что и у int-а бывает разный размер, что функции getch просто нету, ровно как и библиотеки <conio.h>
+1

kokoc88

Когда malloc возвращает NULL, обычно ничего исправить уже нельзя. А сложность программы, которая сама использует malloc вырастает в разы.

ppplva

По крайней мере, можно и нужно культурно выйти, а не упасть с сегфолтом.

shlyumper

Вот так люди привыкают, что все всегда работает, что malloc и fopen всегда возвращает не NULL...
Когда malloc возвращает NULL, обычно ничего исправить уже нельзя. А сложность программы, которая сама использует malloc вырастает в разы.
это нужно добавить в букварь программирования!

Dasar

> Когда malloc возвращает NULL, обычно ничего исправить уже нельзя
правильная программа просто откатывает выполнение последнего действия

amkharchenko

Вот это уж точно. Необработка malloc == NULL и связанное с этим тихое падение программы с прелестями типа несохраненных результатов итп --- хуже не придумаешь.

gopnik1994

правильная программа не просто откатывает выполнение последнего действия, но и предупреждает юзера об ошибке

amkharchenko

И дает адресок магазина, где ему еще памяти прикупить

Dasar

это само собой.
это уже делает нормальная программа, а не только правильная.

bobby

Нет-нет, сама заказывает память через инет с доставкой!

mira-bella

Нет-нет, сама заказывает память через инет с доставкой!
Ну если только по кредитке Билла Гейтса.

mira-bella

Когда malloc возвращает NULL, обычно ничего исправить уже нельзя. А сложность программы, которая сама использует malloc вырастает в разы.
смысл этой фразы от меня ускользает
Что значит "А сложность программы, которая сама использует malloc вырастает в разы."?
Если программа "сама" не использует malloc, то проблем с malloc-ом не возникнет по определению, а если C программист (не путать с C++ программистом) решил воспользоваться прелестями динамического выделения памяти, то уж пусть изволит проверять возвращаемое значение malloc/calloc/realloc, иначе он долб или раздолбай (что для автора промышленного софта еще хуже чем долб, а для учащегося простительно, но нежелательно).
PS: Когда malloc возвращает NULL очень много чего можно сделать - как минимум почти всегда: для интерактивной программы - выдать сообщение о нехватки памяти с предложением освободить немного (в противном случае откат текущей операции для потоковой/скриптовой/консольной программы выдать сообщение о нехватке памяти на stderr и вернуть код ошибки, который может быть проанализирован, вместо тихого segfault-а.

psihodog

прелестями динамического выделения можно воспользоваться и без маллока

mira-bella

прелестями динамического выделения можно воспользоваться и без маллока
В языке C средствами стандартной библиотеки?
Конечно можно: с помощью calloc/realloc.

yolki

Интересно, как в C использовать динамическую памать без malloc/calloc/realloc?

psihodog

asm?

FRider

через платформозависимые вызовы.

Sharp

Ты это сказал исключительно ради красного словца или действительно так считаешь?
Я думаю, что у был риторический вопрос. А если кто-то начнет говорить, что он еще в детстве писал свой собственный malloc на asm-е, то я готов дать этому человеку shell-овый логин на BSD-е и пусть он повторит свой подвиг.

ppplva

Ты явно переоцениваешь сложность этого "подвига"

mira-bella

через платформозависимые вызовы.
угу
ключевое слово "платформозависимые"

tokuchu

прелестями динамического выделения можно воспользоваться и без маллока
Угу. IPC shared mem или mmap?

FRider

чювак, например в винде есть апи функции управления кучей, в никсах наверняка тоже что то есть.

Ivan8209

Правильная программа не использует malloc.
---
...Я работаю антинаучным аферистом...

Ivan8209

> Когда malloc возвращает NULL, обычно ничего исправить уже нельзя.
Наглая ложь.
Обычно можно переписать всё так, чтобы не использовать malloc и т. п.
---
...Я работаю антинаучным аферистом...

alexkravchuk

Наглая ложь.
Обычно можно переписать всё так, чтобы не использовать malloc и т. п.
Можно подробнее про неиспользование malloc'a? Я надеюсь, что оно не заключается в замене шила на мыло, или на new, который по сути - тот же malloc? Откуда брать память?

ppplva

Из стека, конечно !
Судя по дате регистрации, первый раз Контру видишь ?

Ivan8209

Из стека.
Если не хватает одного, сделать ещё один.
---
"Just let me listen to my rock'n'roll music..."

alexkravchuk

Идею понял, но мне не кажется это правильным... Оставим за кадром вопрос "а хватит ли стека", и т.п. Выделение из стека подразумевает, что память, выделенная в какой-то функции, должна быть освобождена по завершению работы этой функции, правильно ли я понимаю? Это значит, что подобной конструкции, типичной для "объектного" подхода, использовать не получится:
///////////////
func_main(ing something)
{
init_object(obj); // Ининиализируем сложный объект, размер которого заранее не известен
if(something)
do_with_object_1(obj);
else
do_with_object_2(obj);
destroj_object(obj);
}
/////////////////
Я догадываюсь, что возможно это уже обсуждалось... Но мне не понятно, а искать в архивах - долго...

Ivan8209

Если тебе очень нужна куча, то работай с кучей.
Но не через malloc.
---
...Я работаю антинаучным аферистом...

alexkravchuk

> Если тебе очень нужна куча, то работай с кучей.
> Но не через malloc.
Я бы поспорил, нужен ли malloc или нет, и нужно ли писать собственную версию, но видимо действительно за свои 3 месяца регистрации я не всё видел

Ivan8209

> Выделение из стека подразумевает, что память,
> выделенная в какой-то функции, должна быть освобождена
> по завершению работы этой функции, правильно ли я понимаю?
Нет.
> Это значит, что подобной конструкции, типичной для "объектного" подхода,
> использовать не получится:
Ну так и не используй.
---
...Я работаю антинаучным аферистом...

Dasar

> Правильная программа не использует malloc.
Это низкоуровневная программа, а не правильная программа, обычно стараются не использовать работу с кучей(malloc).
ps
Если кол-во и время жизни разных сущностей в программе сильно зависит от внешнего окружения, то без кучу ты все равно не обойдешься (одних стеков тебе не хватит).

rosali

одних стеков тебе не хватит
Не, ну если стеки будут образовывать кучу... должно хватить

Ivan8209

Расскажи, как сделана куча.
---
...Я работаю антинаучным аферистом...

Dasar

куча, в отличие от стека, позволяет удаление из середины.

Ivan8209

Стек тоже позволяет удалять из середины.
---
"Расширь своё сознание!"

Dasar

> Стек тоже позволяет удалять из середины
тогда чем тогда такой хитрый стек отличается от кучи?

alexkravchuk

>> Выделение из стека подразумевает, что память,
>> выделенная в какой-то функции, должна быть освобождена
>> по завершению работы этой функции, правильно ли я понимаю?
>Нет.
Хорошо, тогда я говорю про реализацию в C/C++, когда я создаю массив, место под который прозрачным образом выделяется в стеке. Если же мне нужно выделять память явно, то тогда как минимум, нужны серьёзные основания для того, чтобы утрерждать, что от использования malloc/new нужно отказываться.
>> Это значит, что подобной конструкции, типичной для "объектного" подхода,
>> использовать не получится:
> Ну так и не используй.
Почему? Ради чего отказываться от очень удобных и полезных конструкций?
> Стек тоже позволяет удалять из середины.
По определению - не позволяет, иначе это уже не стек будет.
Далее, рассмотрим случай, когда констукция позволяет удалять из середины. Тогда получается, что мы или должны сдвигать все последующие элементы на освободившиеся места, что занимает много времени и создаёт большие проблемы для указателей, или же мы изначально должны работать не с непрерывным учаском памяти, а с таблицей указателей, но тогда это будет просто одной из возможных реализаций полного аналога malloc'а....
Я опять что-то непонимаю?

Papazyan

Надо использовать GC, вот и все.

lilia_rass

Что?

Ivan8209

Тем, что это стек, а потому он значительно проще кучи.
---
...Я работаю антинаучным аферистом...

bleyman

Для использования или для реализации?

Ivan8209

И для того, и для другого.
---
"Это проявление Аль-Хагг..."

ppplva

Речь о стеке с удалением из середины за O(n) ?

Ivan8209

Что обозначено через "n"?
---
...Я работаю...

ppplva

Длина (глубина) стека

Ivan8209

Если делать всё правильно, то можно быстрее.
---
"Расширь своё сознание!"

bleyman

>> Если делать всё правильно, то можно быстрее.
Ага, и тогда получится на самом деле куча, только с претензией на стекообразность =)

Ivan8209

Если делать неправильно --- да.
Если же всё делать правильно, будет обычный стек.
---
"Расширь своё сознание!"

Ivan8209

Кстати, если умело действовать, то удаление из стека любой глубины будет O(1).
Как это сделать, оставляю в качестве домашнего задания.
---
...Я работаю антинаучным аферистом...

rosali

Что ты называешь "элементом" своего стека? Задача аллокации элементов фиксированного размера слишком тривиальна чтобы ее обсуждать, не находишь? И вообще что значит "удалить" в середине стека элемент? Сдается, ты мыслишь этот свой "стек" надстройкой над уже кем-то построенным хипом, какая тогда от него польза?

Ivan8209

1. Объект произвольной известной длины.
2. Знаю об этом.
3. Осуществить преобразование: <1> ... <n> мусор <верхний> --> <1> ... <n> <верхний>
4.1. Нет.
4.2. Большая.
---
...Я работаю антинаучным аферистом...

bastii

 
Что ты называешь "элементом" своего стека? Задача аллокации элементов фиксированного размера слишком тривиальна чтобы ее обсуждать, не находишь?
Не очевидно. Может расскажешь как реализовать аллокации большого числа элементов фиксированного размера так, чтобы выделение (освобождение) было максимально эффективным. Мне вот кажется не такой уж и тривиальной задачей.
Хотя может быть это я такой темный

lilia_rass

Так я так понимаю вопрос был в том, как именно удалять, т.е. копировать или нет? Не могли бы Вы более подробно написать?

Ivan8209

Достаточно понять, как в сях получается удаление из середины стека.
Это достаточно просто и часто встречается.
Просто это хорошо спрятано за блочной структурой.
---
"Расширь своё сознание!"

alexkravchuk

Достаточно понять, как в сях получается удаление из середины стека.
Это достаточно просто и часто встречается.
Просто это хорошо спрятано за блочной структурой.
Я всё же не понимаю...
Во-первых, если мы работаем в C/C++, то из-за наличия указателей необходимо, чтобы физически выделенная память оставалась на прежнем месте, перекопирование не допускается.
Допустим, мы работаем с блоками одинакового размера. В этом случае, если я правильно понимаю, то, что ты описываешь, называется "двухсторонне связанный список", и мы работаем со структурами вида "id предыдущего, id следующего, номер блока". Соответственно, есть две структуры, структура свободных и структура занятых блоков. В таком варианте конструкция работает очень хорошо, можно сказать - идеально. Но - это не стек по определению, это двухсторонне связанный (или двунаправленный - не помню точно, как это корректно называется) список. Далее, рассмотрим ситуацию, когда мы работаем с блоками переменной длины. В этом случае, так как в C/C++ необходима поддержка указателей, то есть конструкций вида *(ptr+NNN)=XXX;, и из-за этого адресное пространство выделяемого блока должно быть монолитным. Это значит, что выделяемый блок необходимо составить из нескольких малых блоков, а значит или память нужно двигать, или может случиться так, что выделенный блок будет немонолитным. Обе ситуации не приемлимы. В любом случае, получается свой менеджер памяти.

dam555

Походу в алгоритмах ты нихрена не шаришь. Прислушайся к тому, что тебе люди говорят ну или объясни подробнее, свою мысль.

Ivan8209

Использовать указатели --- это требование религии?
Нет, я не говорю ни про какие связанные списки.
Память так или иначе приходится двигать,
и это не обойти, пока ты используешь столь низкоуровневые языки,
вроде сей или приплюснутых сей.
Если ты заведёшь ещё один стек, то и соответствующие средства
работы с ним образуют "свой менеджер памяти",
пусть он и заключается в действии смещения указателя вершины стека.
---
"Расширь своё сознание!"

Ivan8209

Походу в структурах данных ты нихрена не шаришь.
Включи мозг и подумай.
---
"Расширь своё сознание!"

dam555

Видимо не шарю, вот и хочется открыть что-то новое для себя в этой области. Хоть ссылку дай почитать

Ivan8209

Керниган объясняет, как сделан стек в сях?
---
...Я работаю антинаучным аферистом...

dam555

Я тебе не говорю про конкретную реализацию - смотри шире. И сообрази, что эффективную структуру данных работы с памятью на основе стека сделать нельзя. Либо, это нужно называть своими именами, а не стеком Обрати внимание, что тебе уже дал подробный ответ.
Чтобы конкретнее разговаривать. Приведи список операций, которые умеет делать твой уникальный стек и для каждой операции прикинь асимптотику ее выполнения. А мы тебе раскажем что это за такая реализация и как она называется

dam555

Просмотрел еще раз Кернигана и что-то не нашел, чтобы там шло описания работы с динамической памятью путем отказа от malloc через стек. В книжке вроде бы подробно разъясняется как происходят вызовы функций, как функционирует сам стек. Но заметь, что про работу с блоками памяти нет ни слова. Что-то я не нашел, где там дается описание как удалять из середины стека. Или я в чем-то не прав?

Ivan8209

bcopy одного элемента зависит от глубины стека?
Сложение зависит?
return/longjmp зависит?
Вот и получается, что удаление из стека производится за O(1 а не O(n).
---
...Я работаю антинаучным аферистом...

dam555

 
bcopy одного элемента зависит от глубины стека?
Не зависит, только копировать приходится не один элемент.
По ходу дела ты рассматриваешь только операции Push и Pop, которые очевидно работают за O(1 а операций удаления из середины стека у тебе просто не предусмотрено (хотя двунаправленный список спасает ситуацию). Но вот удалять и выделять блоки произвольного размера уже не получится точно!
Попробуй объясни, как последовательный вызов комманд malloc и freeс разной величиной блоков реализовать при помощи стека?

Ivan8209

В том-то и дело, что один.
free для верхних элементов знаешь, как сделать.
А free для нижних элементов откладывается на потом.
Лечись от обобщизма.
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
Дж. В. Гиббс

kruzer25

Если я тебя правильно понял, то это влечёт очень нерациональный расход памяти...

Ivan8209

В зависимости от.
Разумеется, если ты очень хочешь очень экономить память,
можешь пожертвовать скоростью и устроить кучу.
Или сделать удаление за O(n).
---
...Я работаю...

dam555

Реально круто! Ты сделал клевое открытие Срочно ботаю ASM и изучаю исходники
Кстати, если почитаешь Кернигана повнимательнее, там написано для каких ситуаций описанная тобой стратегия работает неплохо - постоянно что-то небольших размеров переменной длины выделяется и освобождается.
Если бы все было настолько просто, люди бы не стратади и не думали как сделать виртуальную память, какие алгоритмы использовать, операции malloc и free бы тогда не тормозили. Была бы польная идилия. Но учитывая, что все эти аспекты в настоящее время присутсвуют, эффективной структуры для выделяения и освобождения памяти не придуманы. Всегда приходится чем-то жертвовать либо скоростью, либо объемами нерационально выделенной памяти.
Ладно, думаю тут предельно понятно, что ты имеешь в виду, и все вытекающие отсюда проблемы. Можно завтра дисскусию продолжить, если тебе еще что-то не ясно

kruzer25

Где тут "очень экономить"?
Если, например, хотим постоянно хранить два или три числа - предыдущее, текущее, следующее - если делать это с помощью твоего "стека" - кончится любое количество памяти.

Sharp

Милый ,
тот факт, что что malloc возвращает NULL не является минусом реализации malloc-а, он просто означает, что твоя программа не может получить больше памяти. Почему, это отдельный вопрос. Может админ запретил выделять больше, может параллельно запущенная прога сожрала всю память, а может кто-то просто вытащил планку памяти, в общем не суть. В такой ситуации все твои предложения отказаться от malloc-а и перейти на стек посылаются куда подальше - ты хоть на два стека перейди, но это не изменит решение администратора о том, сколько памяти нужно твоей программе, и, как бы это не было обидно, не вставит еще одну планку памяти.

Sharp

При работе с динамическими структурами чаще всего встречается две задачи: выделить память под N-байт и выделить память под некую структуру. Для решения первой задачи malloc подходит идеально, а при помощи функции sizeof подходит и для решения второго типа задач.
Можешь описать, как ты собираешся реализовывать подобные задачи на стеке или что тебе там большее нравится?

rosali

А free для нижних элементов откладывается на потом.
Может так оказаться, что никакого "потом" не будет. Ну зачем я что-то пишу в ответ КОНТРЕ ?

Dasar

> А free для нижних элементов откладывается на потом.
это, наверное, все правильно - только речь сейчас идет не об абстрактной машине Тьюринга, а о конкретных программах на конкретных исполнителях, которые, как я уже писал, часто вынуждены работать с сущностями время жизни которых различно и сильно зависит от окружения в момент запуска.

Chupa

сейчас идет не об абстрактной машине Тьюринга, а о конкретных программах на конкретных исполнителях, которые, как я уже писал, часто вынуждены работать с сущностями время жизни которых различно и сильно зависит от окружения в момент запуска.
ура!
надо полагать, теперь ты наконец-то покажешь примеры правильных в программ!

alexkravchuk

В том-то и дело, что один.
free для верхних элементов знаешь, как сделать.
А free для нижних элементов откладывается на потом.
Лечись от обобщизма.
Плохая идея. Сравнима с тем, чтобы память вообще не освобождать.
Например, программа в самом начале считывает из файла матрицу, чтобы найти решение соответствующего ЛУ, выделяет много памяти под промежуточные матрицы, в итоге получает вектор со значениями. Вполне нормально будет, что промежуточные матрицы будут сначала находиться в памяти, а итоговой вектор (который и нужен дальше в программе) - за ними. Вот получается, что довольно большой объём памяти не может быть освобождён только из-за того, что не удалён относительно небольшой кусок памяти под итоговый вектор.
Короче, я не очень понимаю - тебе не нравится внутренняя организация malloc (тогда чем, и чем то, что ты предлагаешь, принципиально отличается? либо тебе не нравится архитектура malloc-free (или new-delete)?

Dasar

> надо полагать, теперь ты наконец-то покажешь примеры правильных в этом смысле программ!
ты до сих пор не видел примеры такого подхода?
Страуструпа хотя бы открывал? Базовые идеи такого подхода у него описываются.

Chupa

>> надо полагать, теперь ты наконец-то покажешь примеры правильных в этом смысле программ!
> ты до сих пор не видел примеры такого подхода?
меня не примеры подхода с базовыми идеями интересуют, а реальные программы
причём, чтобы там был чистый malloc с проверками на ошибки

Dasar

> причём, чтобы там был чистый malloc с проверками на ошибки
такого точно не бывает, потому что это дорого.

Chupa

дорого, да, но, всё-таки, хотелось увидеть чудо

alexkravchuk

> меня не примеры подхода с базовыми идеями интересуют, а реальные программы
> причём, чтобы там был чистый malloc с проверками на ошибки
Может быть не совсем конктерный пример, потому как без исходников, и не знаю, на чём написана программа. ACDSEE (просмотрщик картинок под Win32)
Программа пытается открыть файл с изображением, однако разрешение его слишком большое, и оперативной памяти для этого не хватит. Тогда программа отлавливает, что памяти не хватает, и эту конкретную картинку отказывается просматривать в родном разрешении (в меньших - можно не вылетая при этом. Вот правильная обработка нехватки памяти - ту часть работы, на которую памяти не хватает, программа не делает, но остальные задания корректно обрабатывает.

Chupa

К сожалению, это не совсем то.
Настоящие проблемы возникают, когда памяти перестаёт хватать для простейших операций, например элемент в какой-нибудь внутренний список добавить или ещё что-нибудь запомнить. Хуже всего, когда глюки от нехватки возникают не в самой программе, а в каком-нибудь из используемых ей посторонних API. Тут, вроде, и хочется всё сделать правильно, а не удастся.
Использование исключений и кучи с GC проблему в большинстве случаев решит, нужно только обработчики не забывать, а с чистым malloc будет очень тяжело.

Marinavo_0507

> теперь ты наконец-то покажешь примеры правильных в этом смысле программ!
linux kernel (да и наверное любое ядро) не устраивает?

Chupa

Не особо, так как очень плохо обобщается на прикладные программы. Библиотеки написаны гораздо более паршиво, чем внутренности у ядер ОС, поэтому многое придётся реализовывать с нуля, а это дорого.

Ivan8209

А ты выдели память под итоговый вектор заранее.
---
...Я работаю антинаучным аферистом...

Chupa

Разве что один раз проделать весь этот гемор, создав виртуальную машину для каких-нибудь Java, Lisp, Haskell или ещё чего-нибудь.

alexkravchuk

А зачем? Какие плюсы даёт отказ от использования malloc/new, чтобы из-за этого нужно при программировании заботиться о том, в какой последовательности нужно выделять память под объекты? Минусы, в виде дополнительной работы и отвлечения внимания я вижу... Плюсов - не вижу. Поэтому вопрос мой сводится к "ради чего вообще отказываться от malloc/new, какие плюсы это даст"?

lilia_rass

Чё за GC?

Ivan8209

> ради чего вообще отказываться от malloc/new, какие плюсы это даст
Ради того, чтобы вообще не следить за порядком выделения и освобождения памяти.
---
"Расширь своё сознание!"

Ivan8209

RTFM: garbage collection
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."

lilia_rass

Как же не следить, если наоборот нужно следить, в какрм порядке выделять?

alexkravchuk


А ты выдели память под итоговый вектор заранее.
> ради чего вообще отказываться от malloc/new, какие плюсы это даст
Ради того, чтобы вообще не следить за порядком выделения и освобождения памяти.
Ладно, всё понятно... Короче, так и нужно было говорить, что агитируешь за сборку мусора и за "правильные языки"... А то стек, стек...

Ivan8209

За оптимизацией должен, вообще говоря, следить компилятор.
Человек должен думать.
---
"Так завещал великий и мудрый Ибеме..."

Marinavo_0507

> Библиотеки написаны гораздо более паршиво, чем внутренности у ядер ОС
У ядра вместо таких библиотек - user-level процессы, выполняющиеся в отдельном адресном пространстве, в случае чего процесс прибивается целиком, и некоторые виды мусора за ним подчищаются.

Chupa

Ну да, виртуальная машина.
Многие либы просто так не прибить, если они сходят с ума в том же адресном пространстве.

SPARTAK3959

ACDSEE пытается выделить память, но ее не хватает, тогда она пытается показать окошко с сообщением об ошибке, но памяти под окно уже тоже нет, да и идентификаторы окон давно закончились, а юзверь продолжает ждать уже вторую сотню лет ответа от программы, ведь ему сказали, что она всегда работает без ошибок.
По-моему заботиться о нехватке памяти нужно лишь в случаях когда выделяются блоки более 200Mb-500Mb - просто нужно запрещать операции при выполнении которых будет превышен этот предел (если это заранее (или во время работы на небольшом участке) определить можно даже если память еще есть. А в пределах 200-500Mb память всегда найдется - а если вы выключили swap, то это ваши проблемы.

Sharp

А это уже зависит от степени параноидальности программиста.
Хотя даже в этом случае, одно дело, когда программа вывались в кору из-за обращения к указателю NULL, и совсем другое дело, когда в логах системы появилась запись о нехватке идентификаторов окон.
По-моему заботиться о нехватке памяти нужно лишь в случаях когда выделяются блоки более 200Mb-500Mb - просто нужно запрещать операции при выполнении которых будет превышен этот предел (если это заранее (или во время работы на небольшом участке) определить можно даже если память еще есть. А в пределах 200-500Mb память всегда найдется - а если вы выключили swap, то это ваши проблемы.
И еще скажи, что у тебя все файлы на жестком диске меньше 200-500Mb. К примеру, крупные БД и расчетные программы выделяют и работают с объемами памяти более 200-500Mb. Просто им без этого нельзя.

Dasar

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

Olyalyau

Например так: brk mmap/mumap.

Olyalyau

Я в своё время писал штук пять разных malloc'а. Самый простой занимал с десяток строк, самый сложный использовал сбалансированное дерево, самый низкоуровневый проверял, сколько памяти в машине (запускался без ОС в нулевом кольце защиты) и выделял её постранично.
Ни один не содержал ни одной ассемблерной строки, работы с портами или биосом.

Olyalyau

через платформозависимые вызовы.
угу
ключевое слово "платформозависимые"
Есть и стандартные POSIX-вызовы: mmap, например.

mira-bella

через платформозависимые вызовы.
угу
ключевое слово "платформозависимые"
Есть и стандартные POSIX-вызовы: mmap, например.
конечно
Вот только стандартные POSIX-вызовы тоже платформозависимые в том смысле, который я подразумевал, хотя и портируемы между POSIX-совместимыми окружениями. Очевидно POSIX-вызовы доступны только в системе, поддерживающей POSIX API, а не являются возможностями языка программирования C, как функции стандартной библиотеки.
Хотя это и прозвучит как ересь, но стандартные POSIX-вызовы ни чем не лучше, чем например вызовы Win32 API, несмотря на стандартизированность и реализованность на большем количестве платформ. Просто POSIX - это стандарт не имеющий прямого отношения к языку C, хотя и ссылающийся на стандарт C.

Ivan8209

> а не являются возможностями языка программирования C,
> как функции стандартной библиотеки.
Последние тоже не являются возможностями языка программирования С,
а существуют независимо.
Мало того, это прозвучит как ересь, но очень много функций стандартной библиотеки платформозависимы.
В частности, довольно сильно опираются на тот же POSIX.
POSIX, кстати, имеет прямое отношение к языку C.
---
...Я работаю антинаучным аферистом...

mira-bella

Последние тоже не являются возможностями языка программирования С,
а существуют независимо.
Что значит "независимо"? Как что реализовано никого не волнует.
Главное, что стандартная библиотека описана в стандарте языка C, а значит является его частью по определению, ибо по определению стандарт языка C определяет язык C.
Впрочем формальный взгляд на этот вопрос не важен: если привык, можно логически отделять язык от стандартной библиотеки, но самое главное, что стандартная библиотека описана в стандарте C (в отличие от POSIX API а значит она необходима для реализации на любой платформе совместимой со стандартом (с поддержкой host environment) - т.е. поддерживающей язык C, а вот POSIX - нет. Даже для совместимости с C standalone environment функциональность некоторых header-ов необходима (типа <stddef.h>, <stdint.h>, <float.h>, <limits.h>).
Мало того, это прозвучит как ересь, но очень много функций стандартной библиотеки платформозависимы.
В частности, довольно сильно опираются на тот же POSIX.
видимо потому, что это и есть ересь.
Что это вообще значит? Что такое "платформозависимы" в твоей терминологии? Реализации функций стандартной библиотеки под винду тоже сильно опираются на POSIX?
Функциональность стандартной библиотеки описана в стандарте языка программирования и она одинакова вне зависимости от платформы поддерживающей C host environment, в том числе независимо от того реализован ли POSIX API в данной ОС.
Одинаковая функциональность API на любой платформе, четко описанная в его спецификации, - это и есть по определению платформонезависимость API.
Очевидно POSIX тоже является платформонезависимым API для систем поддерживающих POSIX, но не для систем в которых можно программировать на языке C, и так же не для систем, на которых поддерживается C host environment.
Функции стандартной библиотеки опираются на стандарт C, а не на POSIX разумеется. Они конечно могут быть реализованы, посредством вызова POSIX функций (которые обычно являются прямыми системными вызовами а могут быть реализованы вызовами Win32 API или вообще непосредственным доступом к оборудованию. Важна их [функций стандартной библиотеки] стандартная функциональность и ее платформонезависимость, а не то, как они реализованы.
POSIX, кстати, имеет прямое отношение к языку C.
POSIX опирается на стандарт C, а вот C не опирается на POSIX.

Ivan8209

> Что значит "независимо"?
> Как что реализовано никого не волнует.
То и значит, что независимо.
Если по-твоему библиотеки являются частью языка,
то это получается очень уж убогий язык.
То, что никого не волнует, как это реализовано, является откровенной ложью.
> Даже для совместимости с C standalone environment
> функциональность некоторых header-ов необходима
> (типа <stddef.h>, <stdint.h>, <float.h>, <limits.h>).
Это вообще является наглой ложью.
> POSIX опирается на стандарт C,
> а вот C не опирается на POSIX.
Это вообще противоречит твоему первому заявлению,
что библиотека входит в язык.
---
"Narrowness of experience leads to narrowness of imagination."

mira-bella

То и значит, что независимо.
Что "то"?
"Вероятность пересечения равна произведению вероятностей"?
Что это значит в данном контексте? Что разные packages реализуют freesanding implementation и большую часть стандартной библиотеки? Какое это вообще имеет отношение к делу? Ты вообще стандарт C читал когда-нибудь? Слышал о его существовании хотя бы?
То, что никого не волнует, как это реализовано, является откровенной ложью.
Хорошо согласен, тогда перефразирую так:
 Если человека, пишущего программу, использующую стандартную библиотеку, волнует то, как реализована стандартная библиотека, а не то, что она делает, то этот человек некомпетентен. Ибо если пишется C прога (или часть проги использующая только стандартную библиотеку, эта прога (или часть проги) должна работать одинаково везде, где есть реализация C hosted implementation, совместимая со стандартом.
 Вполне правомерно волнует реализация стандартной библиотеки в следующих случаях: (1) при выборе той или иной реализации стандартной библиотеки на стадии использования (а не на стадии программирования (2) при написании собственной реализации стандартной библиотеки.
Если по-твоему библиотеки являются частью языка,
то это получается очень уж убогий язык.
Не библиотеки, а стандартная библиотека
Что значит "убогий"? Более "убогий" чем без стандартной библиотеки?
Задолбал разговаривать лозунгами. Не пробовал строить информативные фразы? Бывает очень продуктивно.
> Даже для совместимости с C standalone environment
> функциональность некоторых header-ов необходима
> (типа <stddef.h>, <stdint.h>, <float.h>, <limits.h>).
Это вообще является наглой ложью.
Стандарт почитай, епт. Прежде чем п*здеть. Подсказываю: параграф 4 - Conformance.
Только правильный термин не "C standalone environment", а "C freestanding implementation". Впрочем по смыслу одно и то же.
И цитату приводи из стандарта языка C, которая обосновывает, что это ложь. Потому, что термины C hosted implementation и C freestanding implementation - это термины из стандарта C, и условие совместимости с оными определено этим стандартом.
> POSIX опирается на стандарт C,
> а вот C не опирается на POSIX.
Это вообще противоречит твоему первому заявлению,
что библиотека входит в язык.
Что мой пост забыл прочесть прежде чем отвечать на него?
У меня не было заявления, что "библиотека входит в язык", у меня было заявление, что стандартная библиотека языка C, которая описывается в стандарте языка C, является частью языка C. Стандартная библиотека понимаешь? Уж конечно не POSIX, и не Win32 API, и не OpenGL, и т.д.
"Narrowness of experience leads to narrowness of imagination."
exactly

bleyman

>> Реализации функций стандартной библиотеки под винду тоже сильно опираются на POSIX?
Винда позикс-совместима, кстати.

bleyman

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

sergey_m

> Винда позикс-совместима, кстати.
Самой первой версии POSIX? Толку от этой совместимости ноль, разве что размахивать ей как флагом.

enochka1145

// Задолбал разговаривать лозунгами.
Ничего другого ты и не получишь. Тебя же вроде предупреждали - смотри, с кем разговариваешь. Есть мнение, что этот твой собеседник - форумский робот.

bleyman

Не очень понял, что ты хотел сказать. http://en.wikipedia.org/wiki/POSIX

Sharp

он наверняка бы не стал писать на языке, в котором не определён размер инта.
sizeof(int). Или тебе очень хочется знать, сколько именно бит он занимает?
Мне кажется, что это уже не забота программиста, а больше забота компилятора - высчитывать сколько именно занимает int. Если же тебе это сильно критично, то можно ввести свой тип (что-нить типа size_t) и в зависимости от конкретной платформы define-ить его на то, что тебе надо.

Ivan8209

> Не библиотеки, а стандартная библиотека
Для тебя --- _стандартная_библиотека_.
> Что значит "убогий"?
> Более "убогий" чем без стандартной библиотеки?
То и значит --- убогий.
Посмотрел я, зачем нужен stddef.h.
О сях я был слишком хорошего мнения.
Оказывается, это ещё более убогий язык, чем я думал.
> Только правильный термин не "C standalone environment",
> а "C freestanding implementation".
> Впрочем по смыслу одно и то же.
То есть, ты отсылаешь к стандарту, которым сам не владеешь.
"C hosted implementation" и "C freestanding implementation"
никак не могут быть терминами из стандарта, потому что
термины стандарта вне стандарта вводятся через слово "standard".
Иначе это термины общего значения, и означают они ---
hosted & freestanding implementations resp.
> У меня не было заявления, что "библиотека входит в язык",
> у меня было заявление, что стандартная библиотека языка C,
> которая описывается в стандарте языка C,
> является частью языка C.
То есть часть целого не входит в целое.
Ты думай, что пишешь-то!
> Стандартная библиотека понимаешь?
Стандартн_ую_ библиотек_у_ не понимаю.
Успокойся прежде, чем писать.

Мне
надоели ноты ---
много больно пишут что-то.

Ivan8209

> Или тебе очень хочется знать, сколько именно бит он занимает?
Кстати, как это сделать это в ходе сборки?
---
A44: Ламеры в гамаке пусть в тапках трахаются --- это их проблемы.
Я в своём гамаке хочу полноценно трахаться на лыжах.

kruzer25

КОНТРА, всё забываю у себя спросить - а что ты используешь, кроме форта?

Ivan8209

Схему.
---
"Пусть расцветают сто цветов, пусть борются сотни школ в идеологии."

kruzer25

Блок-схемы, в смысле?

Ivan8209

http://schemers.org/
---
"Ты не гуманитарий случаем?" (D_M)

alexkravchuk

> Блок-схемы, в смысле?
Не стебись, use rambler.
Функциональщик он, для него все остальные типы программирования не достойны Хорошо еще, что хоть не Луговский.

Ivan8209

А ты на наш биореактор не наезжай!
---
"Химическая технология --- самая научная наука."

kruzer25

Я не стебался...
Функциональщик он, для него все остальные типы программирования не достойны
Впервые слышу такие умные слова... насколько я сейчас понял - он не кодер?

kruzer25

Мехматянин...

Ivan8209

Значит, гуманитарий.
---
"Математика --- это язык."
Дж. В. Гиббс

alexkravchuk

вопрос не в том, гуманитарий или нет... Просто все эти схемы и лиспы - это интересно, конечно, и местами очень полезно, однако не нужно пытаться навязать этот подход на все IT. Очень много областей, где такой подход, в общем, не приемлим, и то, что ты говорил про организацию памяти - тоже... И это серьёзные и нужные задачи, в которые нужно всерьёз погружаться - не нужно всё сводить к каким-то матмоделям.

mira-bella

Видишь ли, если человек пишет именно на С, а не на жаве или на шарпе, например, значит, его волнует в первую очередь скорость. Если бы его волновала кроссплатформенность, он наверняка бы не стал писать на языке, в котором не определён размер инта.
не
если человека интересует только скорость - он пишет на ассемблере
а вот если человека интересует скорость и кроссплатформенность одновременно, тогда он пишет на C.
Размер инта и остальных типов очень даже определен и легко выясняется функциональностью <limits.h> и/или sizeof. Только он может быть различный для разных платформ. Некоторые трудности при обеспечении портируемости бинарных структур определенно есть, но они преодолимы, хотя и не с абсолютной портируемостью, но с очень большой степенью оной.
А когда человека волнует скорость, он, естественно, интересуется реализацией некоторых функций.
Когда речь идет о довольно элементарных и повсеместно используемых функциях, таких как функции стандартной библиотеки, вполне логично предположить, что наиболее распространенные реализации близки к максимальной эффективности (что и имеет место на практике а значит вполне достаточно иметь представление о производительности наилучших возможных реализаций стандартных функций, чтобы эффективно программировать для стандартной библиотеки.
А интересоваться как оно на самом деле где-то реализовано, разве что из любопытства или для общего развития, но уж никак не для оптимизации.

Ivan8209

> Очень много областей, где такой подход, в общем, не приемлим
...Например.
Опять "narrowness of experience leads to narrowness of imagination?"
Значит, это наглая ложь.
> серьёзные и нужные задачи, в которые нужно всерьёз
> погружаться - не нужно всё сводить к каким-то матмоделям.
Серьёзные задачи требуют серьёзной мат. модели.
Это тебе не окошки рисовать.
---
"Люди недалёкие обычно осуждают всё,
что выходит за пределы их понимания."

kruzer25

Серьёзные задачи требуют серьёзной мат. модели
Матмодели самой задачи, а не теории программирования

mira-bella

>> Реализации функций стандартной библиотеки под винду тоже сильно опираются на POSIX?
Винда позикс-совместима, кстати.
Ну и что?
Все равно реализации стандартной библиотеки под винду обычно не через POSIX функции.

mira-bella

> Не библиотеки, а стандартная библиотека
Для тебя --- _стандартная_библиотека_.
> Что значит "убогий"?
> Более "убогий" чем без стандартной библиотеки?
То и значит --- убогий.
А ведь в самом деле похоже на робота.
А такие осмысленные некоторые реплики. Неужели AI боты уже достигли подобных высот? Да нееее... слишком осмысленно все же для робота, имхо.

alexkravchuk

> Опять "narrowness of experience leads to narrowness of imagination?"
А по русски? "создавать себе трудности на пустом месте только для ради того, чтобы их потом преодолевать"?
Это я к тому, что одно дело решать задачу, которую легко формализовать, но сложно решить, а другое дело - это "моделировать реальность". Возвращаясь к тому, о чём был тред - если есть объект, под который, например, выделяется память, то не всегда вообще возможно пресказать (даже на момент запуска программы сколько этот объект будет жить, сколько ресурсов потреблять, и соответственно, где его рациональнее расположить в памяти...

Ivan8209

И что?
Ты где-нибудь видел математическую модель,
использующую не функциональные зависимости,
а что-нибудь "объектно-ориентированное?"
---
"Я знаю правду! Все прежние правды --- прочь!"

ppplva

Я видел. Я их сам даже иногда составляю.
Только ты, конечно, скажешь, что это нифига не математическая модель.
Это как раз тот самый "narrowness of imagination"

Ivan8209

> другое дело - это "моделировать реальность".
Как часто тебе приходилось моделировать реальность?
> не всегда вообще возможно предсказать
"Функциональщики" этим довольно успешно занимаются.
И может, надо прекратить заниматься откровенной ерундой,
повторяя за кем-то слова о невозможности что-либо сделать.
---
"Narrowness of experience leads to narrowness of imagination."

Ivan8209

И что?
Ты пробовал составлять более математические модели,
функциональные и можешь убедительно показать, что и как.
---
"Narrowness of experience leads to narrowness of imagination."

mira-bella

Посмотрел я, зачем нужен stddef.h.
О сях я был слишком хорошего мнения.
Оказывается, это ещё более убогий язык, чем я думал.

Только сейчас посмотрел зачем нужен <stddef.h>?
И ты еще споришь на тему языка C? Насколько я понял зачем нужен <stdint.h>, <limits.h>, <float.h>, и т.д. ты еще не посмотрел. Не говоря уже о том что стандарт в жизни своей не открывал.
> Только правильный термин не "C standalone environment",
> а "C freestanding implementation".
> Впрочем по смыслу одно и то же.
То есть, ты отсылаешь к стандарту, которым сам не владеешь.
бугага
дословно наизусть не помню весь стандарт, если ты об этом.
"C hosted implementation" и "C freestanding implementation"
никак не могут быть терминами из стандарта, потому что
термины стандарта вне стандарта вводятся через слово "standard".
Иначе это термины общего значения, и означают они ---
hosted & freestanding implementations resp.
Что стандарт открыть все же не решился, а словоблудие это призвание и работа. Или как?
Если очень нравится можешь добавлять слово "standard", а мне кажется вполне достаточным "C" (которое по определению ссылается на стандарт языка C). Кроме того насколько мне известно термины "hosted implementation" и "freestanding implementation" применительно к языку C нигде кроме стандарта не вводятся, поэтому двусмысленности накакой нет.
> У меня не было заявления, что "библиотека входит в язык",
> у меня было заявление, что стандартная библиотека языка C,
> которая описывается в стандарте языка C,
> является частью языка C.
То есть часть целого не входит в целое.
Ты думай, что пишешь-то!

Думай над тем что читаешь и не вырывай фразы из контекста.

sergey_m

> Не очень понял, что ты хотел сказать. http://en.wikipedia.org/wiki/POSIX
Ссылку ты привёл не самую лучшую. Всё таки у POSIX есть свой собственный первоисточник в интернете. Однако и из этой ссылки можно почерпнуть полезную информацию. А именно:
Стандарты POSIX развиваются. Кроме того, есть несколько отдельных стандартов, покрывающих отдельные куски функциональности ОС. Из всех Windows только NT прошла сертификацию на real-time extensions, и очевидно, что это было давно. Практической пользы на сегодняшний день от этого нет, но можно вот на форумах заявлять, что Windows соответствует POSIX. Умалчивая о какой виндовз речь и о каком именно стандарте POSIX речь, и какого года.

alexkravchuk

> другое дело - это "моделировать реальность".
Как часто тебе приходилось моделировать реальность?
Хорошо, объекты в БД, с которыми постоянно идёт работа - этим тоже функциональщики занимаются?

Ivan8209

> Только сейчас посмотрел зачем нужен <stddef.h>?
Да, потому что никогда раньше он мне нафиг не был нужен.
> Не говоря уже о том что стандарт в жизни своей не открывал.
У меня есть стандарт де-факто, мне хватает.
> а мне кажется вполне достаточным "C"
> (которое по определению ссылается на стандарт языка C).
А мне это не только не кажется, но ещё и вредно.
Потому что в твоём стандарте описано то, что не может существовать в условиях отсутствия файловой системы.
А в последнее время у меня наблюдается именно это.
И это именно си.
Но без заморочек с кучей заголовочных файлов.
И уж тем более --- со стандартной библиотекой,
которая не работает и даже бесполезна большей частью.
>>> У меня не было заявления, что "библиотека входит в язык",
>>> у меня было заявление, что стандартная библиотека языка C,
>>> которая описывается в стандарте языка C,
>>> является частью языка C.
>> То есть часть целого не входит в целое.
>> Ты думай, что пишешь-то!
> Думай над тем что читаешь и не вырывай фразы из контекста.
Я перечитал отмеченное тремя знаками ">" ещё раз.
Мне ещё раз повторить отмеченное двумя знаками?
---
"Студенту надо повторять всё три раза, Ганс. Три раза. Запомни, Ганс: три раза."

Ivan8209

Не все БД функциональные, но то, что обычно требуется,
ложится на функциональную парадигму хорошо.
---
...Я работаю антинаучным аферистом...

mira-bella

> Только сейчас посмотрел зачем нужен <stddef.h>?
Да, потому что никогда раньше он мне нафиг не был нужен.
Ну а зачем тогда уже не первые сутки разговаривать о стандартной библиотеке C, если тебе о ней мало что известно и вообще она тебя не интересует?
> а мне кажется вполне достаточным "C"
> (которое по определению ссылается на стандарт языка C).
А мне это не только не кажется, но ещё и вредно.
Потому что в твоём стандарте описано то, что не может существовать в условиях отсутствия файловой системы.
А в последнее время у меня наблюдается именно это.
И это именно си.
Но без заморочек с кучей заголовочных файлов.
И уж тем более --- со стандартной библиотекой,
которая не работает и даже бесполезна большей частью.
Это не мой стандарт Это ANSI/ISO - они во всем виноваты.
Но с тем фактом, что определением языка C является стандарт языка C, пожалуй стоит смириться.
Именно для случая отсутствия файловой системы и т.п. и придумана freestanding implementation. Если ты программируешь на C все же рекомендую почитать стандарт, ибо разработчики компиляторов именно на него опираются, не говоря уже о том, что станет понятно как писать портируемые программы (эти несколько заголовочных файлов freestanding implementation совсем не бесполезны, хотя функций вроде не содержат).
Я перечитал отмеченное тремя знаками ">" ещё раз.
Мне ещё раз повторить отмеченное двумя знаками?
Ну зачем ты тут дурачка строишь?
Перечитай не то, что ты изволил вырвать из контекста, а оригинальный пост - весь абзац целиком.
Что за манера вообще в дискуссии вырывать фразы из контекста? Это что нервное?
Может мне твои посты раздробить на отдельные буковки, составить из них и запостить "Войну и мир", какую-нибудь?

Ivan8209

> Ну а зачем тогда уже не первые сутки разговаривать о стандартной библиотеке C,
> если тебе о ней мало что известно и вообще она тебя не интересует?
Мне известно достаточно.
Внутренности libc я немного знаю.
> Но с тем фактом, что определением языка C является стандарт языка C,
Какой стандарт?
K&R --- это тоже стандарт.
> ибо разработчики компиляторов именно на него опираются,
Наглая ложь.
> не говоря уже о том, что станет понятно как писать портируемые программы
Я и без тебя знаю, что такого не может быть.
---
...Я работаю антинаучным аферистом...

Ivan8209

> Может мне твои посты раздробить на отдельные буковки,
> составить из них и запостить "Войну и мир", какую-нибудь?
Давай.
"Войну и мир."
Укажешь перестановку, с помощью которой ты этого добился.
Я проверю.
---
...Я работаю антинаучным аферистом...

mira-bella

Мне известно достаточно.
Внутренности libc я немного знаю.
ну конечно, только про stddef.h не знаешь почему-то? А про limits.h знаешь? (это гораздо интереснее stddef.h)
Знание внутренностей libc не имеет отношения к знанию стандартной библиотеки. Если бы знал стандарт понимал бы это. В юниксовых libc помимо стандартной библиотеки разумеется поддержка POSIX API и прочих дополнительных расширений не говоря уже о том, что у каждой частной реализации есть своя специфика, а знание стандартной библиотеки подразумевает знание того, какая функциональность - стандартная, а какая - расширение.
Какой стандарт?
K&R --- это тоже стандарт.
Это не стандарт.
Это 2 человека: Брайан Керниган и Деннис Риччи, которые кроме того, что оригинальные авторы языка, еще к тому же принимают участие в разработке стандарта. А второе издание их книги как раз описывает первый стандарт C 1989 года. (А первое издание этой же книги и является единственным "стандартом" K&R C).
> ибо разработчики компиляторов именно на него опираются,
Наглая ложь.
Ох ну как же я мог забыть про разработчиков, писавших компиляторы C в далекие 80е годы до выхода стандарта.
> не говоря уже о том, что станет понятно как писать портируемые программы
Я и без тебя знаю, что такого не может быть.
"Narrowness of experience leads to narrowness of imagination." (це)

Ivan8209

> ну конечно, только про stddef.h не знаешь почему-то?
Он мне не нужен.
> А про limits.h знаешь? (это гораздо интереснее stddef.h)
Расскажи, зачем он мне нужен.
> Это не стандарт.
Де-факто стандарт --- тоже стандарт.
> Ох ну как же я мог забыть про разработчиков,
> писавших компиляторы C в далекие 80е годы
http://onboardc.sf.net
---
"Narrowness of experience leads to narrowness of imagination."

SPARTAK3959

Кросс-платформенная программа:

#ifndef WIN32
#error program requires Windows
#endif
#include <windows.h>
...


Если серьезно. Почему-то не кросс-платформенный KOL для не кросс-платформенного Delphi генерирует .exe файлы размером порядка 30-50Kb, а такая же кросс-платформенная программа (с установкой widget type=win32) на кросс-платформенном Lazaurus для кросс-платформенного Free Pascal - 1.5Mb. Даже обычный RAD в Delphi в этом случае обходится размером 300-400Kb. Если бы разница не была столь велика, я бы окончательно перешел на Lazaurus...
Практика открытых проектов в интернете показывает, что скачанные исходники, как правило, не удается скомпилировать под windows (хотя авторы утверждают, что их программа переносима под windows). Приходится исправлять исходники, подбирать правильные значения параметров в конфигурационных .h файлах и.т.д. Так же разработчики открытых проектов частенько не осознают, что их программу будут компилировать в враждебной windows, на которой будет установлен лишь C/C++, а никаких интерпретаторов/компиляторов perl'a, ruby'a, python'a, nasm'a и никаких cygwin'ов не будет.

alexkravchuk

Так же разработчики открытых проектов частенько не осознают, что их программу будут компилировать в враждебной windows, на которой будет установлен лишь C/C++, а никаких интерпретаторов/компиляторов perl'a, ruby'a, python'a, nasm'a и никаких cygwin'ов не будет.
Не согласен. В любом случае необходимы какие-то библиотеки-обвязки, чтобы можно было работать платформенно-независимо с графикой, сообщениями, сетью и т.п. Поэтому просто компилятора заведомо не хватит на что-то отличное от консольного и несетевого - или программа должна содержать специфический для платформы код, или должны быть установлены дополнительные средства (библиотеки или что-либо ещё).

kruzer25

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