malloc и использование динамической памяти
Ибо с самого начала надо учиться делать правильно.+1
А то потом будет труднее переучиваться.
Вот так люди привыкают, что все всегда работает, что malloc и fopen всегда возвращает не NULL...
А если вдруг ихние программы попытаться запустить на другой машине, с другой архитектурой, с другой OC, то тогда можно выяснить, что и у int-а бывает разный размер, что функции getch просто нету, ровно как и библиотеки <conio.h>
Когда malloc возвращает NULL, обычно ничего исправить уже нельзя. А сложность программы, которая сама использует malloc вырастает в разы.
По крайней мере, можно и нужно культурно выйти, а не упасть с сегфолтом.
это нужно добавить в букварь программирования!Вот так люди привыкают, что все всегда работает, что malloc и fopen всегда возвращает не NULL...Когда malloc возвращает NULL, обычно ничего исправить уже нельзя. А сложность программы, которая сама использует malloc вырастает в разы.
правильная программа просто откатывает выполнение последнего действия
Вот это уж точно. Необработка malloc == NULL и связанное с этим тихое падение программы с прелестями типа несохраненных результатов итп --- хуже не придумаешь.
![](/images/graemlins/wink.gif)
![](/images/graemlins/grin.gif)
![](/images/graemlins/wink.gif)
это уже делает нормальная программа, а не только правильная.
Нет-нет, сама заказывает память через инет с доставкой!
Нет-нет, сама заказывает память через инет с доставкой!Ну если только по кредитке Билла Гейтса.
![](/images/graemlins/grin.gif)
Когда malloc возвращает NULL, обычно ничего исправить уже нельзя. А сложность программы, которая сама использует malloc вырастает в разы.смысл этой фразы от меня ускользает
Что значит "А сложность программы, которая сама использует malloc вырастает в разы."?
Если программа "сама" не использует malloc, то проблем с malloc-ом не возникнет по определению, а если C программист (не путать с C++ программистом) решил воспользоваться прелестями динамического выделения памяти, то уж пусть изволит проверять возвращаемое значение malloc/calloc/realloc, иначе он долб или раздолбай (что для автора промышленного софта еще хуже чем долб, а для учащегося простительно, но нежелательно).
PS: Когда malloc возвращает NULL очень много чего можно сделать - как минимум почти всегда: для интерактивной программы - выдать сообщение о нехватки памяти с предложением освободить немного (в противном случае откат текущей операции для потоковой/скриптовой/консольной программы выдать сообщение о нехватке памяти на stderr и вернуть код ошибки, который может быть проанализирован, вместо тихого segfault-а.
прелестями динамического выделения можно воспользоваться и без маллока
прелестями динамического выделения можно воспользоваться и без маллокаВ языке C средствами стандартной библиотеки?
Конечно можно: с помощью calloc/realloc.
![](/images/graemlins/smile.gif)
Интересно, как в C использовать динамическую памать без malloc/calloc/realloc?
asm?
через платформозависимые вызовы.
Я думаю, что у был риторический вопрос. А если кто-то начнет говорить, что он еще в детстве писал свой собственный malloc на asm-е, то я готов дать этому человеку shell-овый логин на BSD-е и пусть он повторит свой подвиг.
![](/images/graemlins/grin.gif)
Ты явно переоцениваешь сложность этого "подвига"
через платформозависимые вызовы.угу
ключевое слово "платформозависимые"
прелестями динамического выделения можно воспользоваться и без маллокаУгу. IPC shared mem или mmap?
![](/images/graemlins/grin.gif)
чювак, например в винде есть апи функции управления кучей, в никсах наверняка тоже что то есть.
---
...Я работаю антинаучным аферистом...
Наглая ложь.
Обычно можно переписать всё так, чтобы не использовать malloc и т. п.
---
...Я работаю антинаучным аферистом...
Наглая ложь.Можно подробнее про неиспользование malloc'a? Я надеюсь, что оно не заключается в замене шила на мыло, или на new, который по сути - тот же malloc? Откуда брать память?
Обычно можно переписать всё так, чтобы не использовать malloc и т. п.
Судя по дате регистрации, первый раз Контру видишь ?
![](/images/graemlins/grin.gif)
Если не хватает одного, сделать ещё один.
---
"Just let me listen to my rock'n'roll music..."
///////////////
func_main(ing something)
{
init_object(obj); // Ининиализируем сложный объект, размер которого заранее не известен
if(something)
do_with_object_1(obj);
else
do_with_object_2(obj);
destroj_object(obj);
}
/////////////////
Я догадываюсь, что возможно это уже обсуждалось... Но мне не понятно, а искать в архивах - долго...
Но не через malloc.
---
...Я работаю антинаучным аферистом...
> Но не через malloc.
Я бы поспорил, нужен ли malloc или нет, и нужно ли писать собственную версию, но видимо действительно за свои 3 месяца регистрации я не всё видел
![](/images/graemlins/smile.gif)
> выделенная в какой-то функции, должна быть освобождена
> по завершению работы этой функции, правильно ли я понимаю?
Нет.
> Это значит, что подобной конструкции, типичной для "объектного" подхода,
> использовать не получится:
Ну так и не используй.
---
...Я работаю антинаучным аферистом...
Это низкоуровневная программа, а не правильная программа, обычно стараются не использовать работу с кучей(malloc).
ps
Если кол-во и время жизни разных сущностей в программе сильно зависит от внешнего окружения, то без кучу ты все равно не обойдешься (одних стеков тебе не хватит).
одних стеков тебе не хватитНе, ну если стеки будут образовывать кучу...
![](/images/graemlins/laugh.gif)
---
...Я работаю антинаучным аферистом...
куча, в отличие от стека, позволяет удаление из середины.
---
"Расширь своё сознание!"
тогда чем тогда такой хитрый стек отличается от кучи?
>> выделенная в какой-то функции, должна быть освобождена
>> по завершению работы этой функции, правильно ли я понимаю?
>Нет.
Хорошо, тогда я говорю про реализацию в C/C++, когда я создаю массив, место под который прозрачным образом выделяется в стеке. Если же мне нужно выделять память явно, то тогда как минимум, нужны серьёзные основания для того, чтобы утрерждать, что от использования malloc/new нужно отказываться.
>> Это значит, что подобной конструкции, типичной для "объектного" подхода,
>> использовать не получится:
> Ну так и не используй.
Почему? Ради чего отказываться от очень удобных и полезных конструкций?
> Стек тоже позволяет удалять из середины.
По определению - не позволяет, иначе это уже не стек будет.
Далее, рассмотрим случай, когда констукция позволяет удалять из середины. Тогда получается, что мы или должны сдвигать все последующие элементы на освободившиеся места, что занимает много времени и создаёт большие проблемы для указателей, или же мы изначально должны работать не с непрерывным учаском памяти, а с таблицей указателей, но тогда это будет просто одной из возможных реализаций полного аналога malloc'а....
Я опять что-то непонимаю?
Надо использовать GC, вот и все.
Что?
---
...Я работаю антинаучным аферистом...
Для использования или для реализации?
---
"Это проявление Аль-Хагг..."
Речь о стеке с удалением из середины за O(n) ?
---
...Я работаю...
Длина (глубина) стека
---
"Расширь своё сознание!"
Ага, и тогда получится на самом деле куча, только с претензией на стекообразность =)
Если же всё делать правильно, будет обычный стек.
---
"Расширь своё сознание!"
Как это сделать, оставляю в качестве домашнего задания.
---
...Я работаю антинаучным аферистом...
Что ты называешь "элементом" своего стека? Задача аллокации элементов фиксированного размера слишком тривиальна чтобы ее обсуждать, не находишь? И вообще что значит "удалить" в середине стека элемент? Сдается, ты мыслишь этот свой "стек" надстройкой над уже кем-то построенным хипом, какая тогда от него польза?
2. Знаю об этом.
3. Осуществить преобразование: <1> ... <n> мусор <верхний> --> <1> ... <n> <верхний>
4.1. Нет.
4.2. Большая.
---
...Я работаю антинаучным аферистом...
Что ты называешь "элементом" своего стека? Задача аллокации элементов фиксированного размера слишком тривиальна чтобы ее обсуждать, не находишь?Не очевидно. Может расскажешь как реализовать аллокации большого числа элементов фиксированного размера так, чтобы выделение (освобождение) было максимально эффективным. Мне вот кажется не такой уж и тривиальной задачей.
Хотя может быть это я такой темный
![](/images/graemlins/confused.gif)
Так я так понимаю вопрос был в том, как именно удалять, т.е. копировать или нет? Не могли бы Вы более подробно написать?
Это достаточно просто и часто встречается.
Просто это хорошо спрятано за блочной структурой.
---
"Расширь своё сознание!"
Достаточно понять, как в сях получается удаление из середины стека.Я всё же не понимаю...
Это достаточно просто и часто встречается.
Просто это хорошо спрятано за блочной структурой.
Во-первых, если мы работаем в C/C++, то из-за наличия указателей необходимо, чтобы физически выделенная память оставалась на прежнем месте, перекопирование не допускается.
Допустим, мы работаем с блоками одинакового размера. В этом случае, если я правильно понимаю, то, что ты описываешь, называется "двухсторонне связанный список", и мы работаем со структурами вида "id предыдущего, id следующего, номер блока". Соответственно, есть две структуры, структура свободных и структура занятых блоков. В таком варианте конструкция работает очень хорошо, можно сказать - идеально. Но - это не стек по определению, это двухсторонне связанный (или двунаправленный - не помню точно, как это корректно называется) список. Далее, рассмотрим ситуацию, когда мы работаем с блоками переменной длины. В этом случае, так как в C/C++ необходима поддержка указателей, то есть конструкций вида *(ptr+NNN)=XXX;, и из-за этого адресное пространство выделяемого блока должно быть монолитным. Это значит, что выделяемый блок необходимо составить из нескольких малых блоков, а значит или память нужно двигать, или может случиться так, что выделенный блок будет немонолитным. Обе ситуации не приемлимы. В любом случае, получается свой менеджер памяти.
Походу в алгоритмах ты нихрена не шаришь. Прислушайся к тому, что тебе люди говорят ну или объясни подробнее, свою мысль.
Нет, я не говорю ни про какие связанные списки.
Память так или иначе приходится двигать,
и это не обойти, пока ты используешь столь низкоуровневые языки,
вроде сей или приплюснутых сей.
Если ты заведёшь ещё один стек, то и соответствующие средства
работы с ним образуют "свой менеджер памяти",
пусть он и заключается в действии смещения указателя вершины стека.
---
"Расширь своё сознание!"
Включи мозг и подумай.
---
"Расширь своё сознание!"
![](/images/graemlins/smile.gif)
---
...Я работаю антинаучным аферистом...
![](/images/graemlins/smile.gif)
Чтобы конкретнее разговаривать. Приведи список операций, которые умеет делать твой уникальный стек и для каждой операции прикинь асимптотику ее выполнения. А мы тебе раскажем что это за такая реализация и как она называется
![](/images/graemlins/grin.gif)
Просмотрел еще раз Кернигана и что-то не нашел, чтобы там шло описания работы с динамической памятью путем отказа от malloc через стек. В книжке вроде бы подробно разъясняется как происходят вызовы функций, как функционирует сам стек. Но заметь, что про работу с блоками памяти нет ни слова. Что-то я не нашел, где там дается описание как удалять из середины стека. Или я в чем-то не прав?
Сложение зависит?
return/longjmp зависит?
Вот и получается, что удаление из стека производится за O(1 а не O(n).
---
...Я работаю антинаучным аферистом...
bcopy одного элемента зависит от глубины стека?Не зависит, только копировать приходится не один элемент.
По ходу дела ты рассматриваешь только операции Push и Pop, которые очевидно работают за O(1 а операций удаления из середины стека у тебе просто не предусмотрено (хотя двунаправленный список спасает ситуацию). Но вот удалять и выделять блоки произвольного размера уже не получится точно!
Попробуй объясни, как последовательный вызов комманд malloc и freeс разной величиной блоков реализовать при помощи стека?
free для верхних элементов знаешь, как сделать.
А free для нижних элементов откладывается на потом.
Лечись от обобщизма.
---
"Математик может говорить, что ему хочется,
но физик должен, хотя бы в какой-то мере, быть в здравом рассудке."
Дж. В. Гиббс
Если я тебя правильно понял, то это влечёт очень нерациональный расход памяти...
Разумеется, если ты очень хочешь очень экономить память,
можешь пожертвовать скоростью и устроить кучу.
Или сделать удаление за O(n).
---
...Я работаю...
![](/images/graemlins/grin.gif)
![](/images/graemlins/grin.gif)
Кстати, если почитаешь Кернигана повнимательнее, там написано для каких ситуаций описанная тобой стратегия работает неплохо - постоянно что-то небольших размеров переменной длины выделяется и освобождается.
Если бы все было настолько просто, люди бы не стратади и не думали как сделать виртуальную память, какие алгоритмы использовать, операции malloc и free бы тогда не тормозили. Была бы польная идилия. Но учитывая, что все эти аспекты в настоящее время присутсвуют, эффективной структуры для выделяения и освобождения памяти не придуманы. Всегда приходится чем-то жертвовать либо скоростью, либо объемами нерационально выделенной памяти.
Ладно, думаю тут предельно понятно, что ты имеешь в виду, и все вытекающие отсюда проблемы. Можно завтра дисскусию продолжить, если тебе еще что-то не ясно
![](/images/graemlins/grin.gif)
Если, например, хотим постоянно хранить два или три числа - предыдущее, текущее, следующее - если делать это с помощью твоего "стека" - кончится любое количество памяти.
тот факт, что что malloc возвращает NULL не является минусом реализации malloc-а, он просто означает, что твоя программа не может получить больше памяти. Почему, это отдельный вопрос. Может админ запретил выделять больше, может параллельно запущенная прога сожрала всю память, а может кто-то просто вытащил планку памяти, в общем не суть. В такой ситуации все твои предложения отказаться от malloc-а и перейти на стек посылаются куда подальше - ты хоть на два стека перейди, но это не изменит решение администратора о том, сколько памяти нужно твоей программе, и, как бы это не было обидно, не вставит еще одну планку памяти.
Можешь описать, как ты собираешся реализовывать подобные задачи на стеке или что тебе там большее нравится?
А free для нижних элементов откладывается на потом.Может так оказаться, что никакого "потом" не будет. Ну зачем я что-то пишу в ответ КОНТРЕ ?
![](/images/graemlins/confused.gif)
![](/images/graemlins/crazy.gif)
это, наверное, все правильно - только речь сейчас идет не об абстрактной машине Тьюринга, а о конкретных программах на конкретных исполнителях, которые, как я уже писал, часто вынуждены работать с сущностями время жизни которых различно и сильно зависит от окружения в момент запуска.
сейчас идет не об абстрактной машине Тьюринга, а о конкретных программах на конкретных исполнителях, которые, как я уже писал, часто вынуждены работать с сущностями время жизни которых различно и сильно зависит от окружения в момент запуска.ура!
надо полагать, теперь ты наконец-то покажешь примеры правильных в программ!
В том-то и дело, что один.Плохая идея. Сравнима с тем, чтобы память вообще не освобождать.
free для верхних элементов знаешь, как сделать.
А free для нижних элементов откладывается на потом.
Лечись от обобщизма.
Например, программа в самом начале считывает из файла матрицу, чтобы найти решение соответствующего ЛУ, выделяет много памяти под промежуточные матрицы, в итоге получает вектор со значениями. Вполне нормально будет, что промежуточные матрицы будут сначала находиться в памяти, а итоговой вектор (который и нужен дальше в программе) - за ними. Вот получается, что довольно большой объём памяти не может быть освобождён только из-за того, что не удалён относительно небольшой кусок памяти под итоговый вектор.
Короче, я не очень понимаю - тебе не нравится внутренняя организация malloc (тогда чем, и чем то, что ты предлагаешь, принципиально отличается? либо тебе не нравится архитектура malloc-free (или new-delete)?
ты до сих пор не видел примеры такого подхода?
Страуструпа хотя бы открывал? Базовые идеи такого подхода у него описываются.
> ты до сих пор не видел примеры такого подхода?
меня не примеры подхода с базовыми идеями интересуют, а реальные программы
причём, чтобы там был чистый malloc с проверками на ошибки
такого точно не бывает, потому что это дорого.
дорого, да, но, всё-таки, хотелось увидеть чудо
> причём, чтобы там был чистый malloc с проверками на ошибки
Может быть не совсем конктерный пример, потому как без исходников, и не знаю, на чём написана программа. ACDSEE (просмотрщик картинок под Win32)
Программа пытается открыть файл с изображением, однако разрешение его слишком большое, и оперативной памяти для этого не хватит. Тогда программа отлавливает, что памяти не хватает, и эту конкретную картинку отказывается просматривать в родном разрешении (в меньших - можно не вылетая при этом. Вот правильная обработка нехватки памяти - ту часть работы, на которую памяти не хватает, программа не делает, но остальные задания корректно обрабатывает.
Настоящие проблемы возникают, когда памяти перестаёт хватать для простейших операций, например элемент в какой-нибудь внутренний список добавить или ещё что-нибудь запомнить. Хуже всего, когда глюки от нехватки возникают не в самой программе, а в каком-нибудь из используемых ей посторонних API. Тут, вроде, и хочется всё сделать правильно, а не удастся.
Использование исключений и кучи с GC проблему в большинстве случаев решит, нужно только обработчики не забывать, а с чистым malloc будет очень тяжело.
linux kernel (да и наверное любое ядро) не устраивает?
Не особо, так как очень плохо обобщается на прикладные программы. Библиотеки написаны гораздо более паршиво, чем внутренности у ядер ОС, поэтому многое придётся реализовывать с нуля, а это дорого.
---
...Я работаю антинаучным аферистом...
Разве что один раз проделать весь этот гемор, создав виртуальную машину для каких-нибудь Java, Lisp, Haskell или ещё чего-нибудь.
А зачем? Какие плюсы даёт отказ от использования malloc/new, чтобы из-за этого нужно при программировании заботиться о том, в какой последовательности нужно выделять память под объекты? Минусы, в виде дополнительной работы и отвлечения внимания я вижу... Плюсов - не вижу. Поэтому вопрос мой сводится к "ради чего вообще отказываться от malloc/new, какие плюсы это даст"?
Чё за GC?
Ради того, чтобы вообще не следить за порядком выделения и освобождения памяти.
---
"Расширь своё сознание!"
---
"Vyroba umelych lidi, slecno, je tovarni tajemstvi."
Как же не следить, если наоборот нужно следить, в какрм порядке выделять?
А ты выдели память под итоговый вектор заранее.
> ради чего вообще отказываться от malloc/new, какие плюсы это дастЛадно, всё понятно... Короче, так и нужно было говорить, что агитируешь за сборку мусора и за "правильные языки"... А то стек, стек...
Ради того, чтобы вообще не следить за порядком выделения и освобождения памяти.
Человек должен думать.
---
"Так завещал великий и мудрый Ибеме..."
У ядра вместо таких библиотек - user-level процессы, выполняющиеся в отдельном адресном пространстве, в случае чего процесс прибивается целиком, и некоторые виды мусора за ним подчищаются.
Многие либы просто так не прибить, если они сходят с ума в том же адресном пространстве.
По-моему заботиться о нехватке памяти нужно лишь в случаях когда выделяются блоки более 200Mb-500Mb - просто нужно запрещать операции при выполнении которых будет превышен этот предел (если это заранее (или во время работы на небольшом участке) определить можно даже если память еще есть. А в пределах 200-500Mb память всегда найдется - а если вы выключили swap, то это ваши проблемы.
Хотя даже в этом случае, одно дело, когда программа вывались в кору из-за обращения к указателю NULL, и совсем другое дело, когда в логах системы появилась запись о нехватке идентификаторов окон.
По-моему заботиться о нехватке памяти нужно лишь в случаях когда выделяются блоки более 200Mb-500Mb - просто нужно запрещать операции при выполнении которых будет превышен этот предел (если это заранее (или во время работы на небольшом участке) определить можно даже если память еще есть. А в пределах 200-500Mb память всегда найдется - а если вы выключили swap, то это ваши проблемы.И еще скажи, что у тебя все файлы на жестком диске меньше 200-500Mb. К примеру, крупные БД и расчетные программы выделяют и работают с объемами памяти более 200-500Mb. Просто им без этого нельзя.
Здесь соглашусь с Контрой, что память и другие ресурсы под аварийную систему должны выделяться заранее, например, сразу при старте программы - тогда и не будет таких проблем.
Например так: brk mmap/mumap.
Ни один не содержал ни одной ассемблерной строки, работы с портами или биосом.
Есть и стандартные POSIX-вызовы: mmap, например.через платформозависимые вызовы.угу
ключевое слово "платформозависимые"
конечноЕсть и стандартные POSIX-вызовы: mmap, например.через платформозависимые вызовы.угу
ключевое слово "платформозависимые"
Вот только стандартные POSIX-вызовы тоже платформозависимые в том смысле, который я подразумевал, хотя и портируемы между POSIX-совместимыми окружениями. Очевидно POSIX-вызовы доступны только в системе, поддерживающей POSIX API, а не являются возможностями языка программирования C, как функции стандартной библиотеки.
Хотя это и прозвучит как ересь, но стандартные POSIX-вызовы ни чем не лучше, чем например вызовы Win32 API, несмотря на стандартизированность и реализованность на большем количестве платформ. Просто POSIX - это стандарт не имеющий прямого отношения к языку C, хотя и ссылающийся на стандарт C.
> как функции стандартной библиотеки.
Последние тоже не являются возможностями языка программирования С,
а существуют независимо.
Мало того, это прозвучит как ересь, но очень много функций стандартной библиотеки платформозависимы.
В частности, довольно сильно опираются на тот же POSIX.
POSIX, кстати, имеет прямое отношение к языку C.
---
...Я работаю антинаучным аферистом...
Последние тоже не являются возможностями языка программирования С,Что значит "независимо"? Как что реализовано никого не волнует.
а существуют независимо.
Главное, что стандартная библиотека описана в стандарте языка C, а значит является его частью по определению, ибо по определению стандарт языка C определяет язык C.
Впрочем формальный взгляд на этот вопрос не важен: если привык, можно логически отделять язык от стандартной библиотеки, но самое главное, что стандартная библиотека описана в стандарте C (в отличие от POSIX API а значит она необходима для реализации на любой платформе совместимой со стандартом (с поддержкой host environment) - т.е. поддерживающей язык C, а вот POSIX - нет. Даже для совместимости с C standalone environment функциональность некоторых header-ов необходима (типа <stddef.h>, <stdint.h>, <float.h>, <limits.h>).
Мало того, это прозвучит как ересь, но очень много функций стандартной библиотеки платформозависимы.видимо потому, что это и есть ересь.
В частности, довольно сильно опираются на тот же POSIX.
![](/images/graemlins/grin.gif)
Что это вообще значит? Что такое "платформозависимы" в твоей терминологии? Реализации функций стандартной библиотеки под винду тоже сильно опираются на 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.
> Как что реализовано никого не волнует.
То и значит, что независимо.
Если по-твоему библиотеки являются частью языка,
то это получается очень уж убогий язык.
То, что никого не волнует, как это реализовано, является откровенной ложью.
> Даже для совместимости с C standalone environment
> функциональность некоторых header-ов необходима
> (типа <stddef.h>, <stdint.h>, <float.h>, <limits.h>).
Это вообще является наглой ложью.
> POSIX опирается на стандарт C,
> а вот C не опирается на POSIX.
Это вообще противоречит твоему первому заявлению,
что библиотека входит в язык.
---
"Narrowness of experience leads to narrowness of imagination."
То и значит, что независимо.Что "то"?
"Вероятность пересечения равна произведению вероятностей"?
![](/images/graemlins/grin.gif)
![](/images/graemlins/grin.gif)
![](/images/graemlins/grin.gif)
Что это значит в данном контексте? Что разные packages реализуют freesanding implementation и большую часть стандартной библиотеки? Какое это вообще имеет отношение к делу? Ты вообще стандарт C читал когда-нибудь? Слышал о его существовании хотя бы?
То, что никого не волнует, как это реализовано, является откровенной ложью.Хорошо согласен, тогда перефразирую так:
Если человека, пишущего программу, использующую стандартную библиотеку, волнует то, как реализована стандартная библиотека, а не то, что она делает, то этот человек некомпетентен. Ибо если пишется C прога (или часть проги использующая только стандартную библиотеку, эта прога (или часть проги) должна работать одинаково везде, где есть реализация C hosted implementation, совместимая со стандартом.
Вполне правомерно волнует реализация стандартной библиотеки в следующих случаях: (1) при выборе той или иной реализации стандартной библиотеки на стадии использования (а не на стадии программирования (2) при написании собственной реализации стандартной библиотеки.
Если по-твоему библиотеки являются частью языка,Не библиотеки, а стандартная библиотека
то это получается очень уж убогий язык.
Что значит "убогий"? Более "убогий" чем без стандартной библиотеки?
Задолбал разговаривать лозунгами. Не пробовал строить информативные фразы? Бывает очень продуктивно.
> Даже для совместимости с C standalone environmentСтандарт почитай, епт.
> функциональность некоторых header-ов необходима
> (типа <stddef.h>, <stdint.h>, <float.h>, <limits.h>).
Это вообще является наглой ложью.
![](/images/graemlins/smirk.gif)
Только правильный термин не "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
Винда позикс-совместима, кстати.
Наглая ложь(с)
Видишь ли, если человек пишет именно на С, а не на жаве или на шарпе, например, значит, его волнует в первую очередь скорость. Если бы его волновала кроссплатформенность, он наверняка бы не стал писать на языке, в котором не определён размер инта.
А когда человека волнует скорость, он, естественно, интересуется реализацией некоторых функций.
Самой первой версии POSIX? Толку от этой совместимости ноль, разве что размахивать ей как флагом.
Ничего другого ты и не получишь. Тебя же вроде предупреждали - смотри, с кем разговариваешь. Есть мнение, что этот твой собеседник - форумский робот.
![](/images/graemlins/grin.gif)
он наверняка бы не стал писать на языке, в котором не определён размер инта.sizeof(int). Или тебе очень хочется знать, сколько именно бит он занимает?
Мне кажется, что это уже не забота программиста, а больше забота компилятора - высчитывать сколько именно занимает int. Если же тебе это сильно критично, то можно ввести свой тип (что-нить типа size_t) и в зависимости от конкретной платформы define-ить его на то, что тебе надо.
Для тебя --- _стандартная_библиотека_.
> Что значит "убогий"?
> Более "убогий" чем без стандартной библиотеки?
То и значит --- убогий.
Посмотрел я, зачем нужен stddef.h.
О сях я был слишком хорошего мнения.
Оказывается, это ещё более убогий язык, чем я думал.
> Только правильный термин не "C standalone environment",
> а "C freestanding implementation".
> Впрочем по смыслу одно и то же.
То есть, ты отсылаешь к стандарту, которым сам не владеешь.
"C hosted implementation" и "C freestanding implementation"
никак не могут быть терминами из стандарта, потому что
термины стандарта вне стандарта вводятся через слово "standard".
Иначе это термины общего значения, и означают они ---
hosted & freestanding implementations resp.
> У меня не было заявления, что "библиотека входит в язык",
> у меня было заявление, что стандартная библиотека языка C,
> которая описывается в стандарте языка C,
> является частью языка C.
То есть часть целого не входит в целое.
Ты думай, что пишешь-то!
> Стандартная библиотека понимаешь?
Стандартн_ую_ библиотек_у_ не понимаю.
Успокойся прежде, чем писать.
Мне
надоели ноты ---
много больно пишут что-то.
Кстати, как это сделать это в ходе сборки?
---
A44: Ламеры в гамаке пусть в тапках трахаются --- это их проблемы.
Я в своём гамаке хочу полноценно трахаться на лыжах.
КОНТРА, всё забываю у себя спросить - а что ты используешь, кроме форта?
---
"Пусть расцветают сто цветов, пусть борются сотни школ в идеологии."
Блок-схемы, в смысле?
Не стебись, use rambler.
Функциональщик он, для него все остальные типы программирования не достойны
![](/images/graemlins/smile.gif)
---
"Химическая технология --- самая научная наука."
Функциональщик он, для него все остальные типы программирования не достойныВпервые слышу такие умные слова... насколько я сейчас понял - он не кодер?
Мехматянин...
---
"Математика --- это язык."
Дж. В. Гиббс
вопрос не в том, гуманитарий или нет... Просто все эти схемы и лиспы - это интересно, конечно, и местами очень полезно, однако не нужно пытаться навязать этот подход на все IT. Очень много областей, где такой подход, в общем, не приемлим, и то, что ты говорил про организацию памяти - тоже... И это серьёзные и нужные задачи, в которые нужно всерьёз погружаться - не нужно всё сводить к каким-то матмоделям.
Видишь ли, если человек пишет именно на С, а не на жаве или на шарпе, например, значит, его волнует в первую очередь скорость. Если бы его волновала кроссплатформенность, он наверняка бы не стал писать на языке, в котором не определён размер инта.не
если человека интересует только скорость - он пишет на ассемблере
а вот если человека интересует скорость и кроссплатформенность одновременно, тогда он пишет на C.
![](/images/graemlins/grin.gif)
А когда человека волнует скорость, он, естественно, интересуется реализацией некоторых функций.Когда речь идет о довольно элементарных и повсеместно используемых функциях, таких как функции стандартной библиотеки, вполне логично предположить, что наиболее распространенные реализации близки к максимальной эффективности (что и имеет место на практике а значит вполне достаточно иметь представление о производительности наилучших возможных реализаций стандартных функций, чтобы эффективно программировать для стандартной библиотеки.
А интересоваться как оно на самом деле где-то реализовано, разве что из любопытства или для общего развития, но уж никак не для оптимизации.
...Например.
Опять "narrowness of experience leads to narrowness of imagination?"
Значит, это наглая ложь.
> серьёзные и нужные задачи, в которые нужно всерьёз
> погружаться - не нужно всё сводить к каким-то матмоделям.
Серьёзные задачи требуют серьёзной мат. модели.
Это тебе не окошки рисовать.
---
"Люди недалёкие обычно осуждают всё,
что выходит за пределы их понимания."
Серьёзные задачи требуют серьёзной мат. моделиМатмодели самой задачи, а не теории программирования
![](/images/graemlins/wink.gif)
>> Реализации функций стандартной библиотеки под винду тоже сильно опираются на POSIX?Ну и что?
Винда позикс-совместима, кстати.
Все равно реализации стандартной библиотеки под винду обычно не через POSIX функции.
> Не библиотеки, а стандартная библиотекаА ведь в самом деле похоже на робота.
Для тебя --- _стандартная_библиотека_.
> Что значит "убогий"?
> Более "убогий" чем без стандартной библиотеки?
То и значит --- убогий.
А такие осмысленные некоторые реплики. Неужели AI боты уже достигли подобных высот? Да нееее... слишком осмысленно все же для робота, имхо.
А по русски? "создавать себе трудности на пустом месте только для ради того, чтобы их потом преодолевать"?
Это я к тому, что одно дело решать задачу, которую легко формализовать, но сложно решить, а другое дело - это "моделировать реальность". Возвращаясь к тому, о чём был тред - если есть объект, под который, например, выделяется память, то не всегда вообще возможно пресказать (даже на момент запуска программы сколько этот объект будет жить, сколько ресурсов потреблять, и соответственно, где его рациональнее расположить в памяти...
Ты где-нибудь видел математическую модель,
использующую не функциональные зависимости,
а что-нибудь "объектно-ориентированное?"
---
"Я знаю правду! Все прежние правды --- прочь!"
Только ты, конечно, скажешь, что это нифига не математическая модель.
Это как раз тот самый "narrowness of imagination"
![](/images/graemlins/smirk.gif)
Как часто тебе приходилось моделировать реальность?
> не всегда вообще возможно предсказать
"Функциональщики" этим довольно успешно занимаются.
И может, надо прекратить заниматься откровенной ерундой,
повторяя за кем-то слова о невозможности что-либо сделать.
---
"Narrowness of experience leads to narrowness of imagination."
Ты пробовал составлять более математические модели,
функциональные и можешь убедительно показать, что и как.
---
"Narrowness of experience leads to narrowness of imagination."
Посмотрел я, зачем нужен stddef.h.
О сях я был слишком хорошего мнения.
Оказывается, это ещё более убогий язык, чем я думал.
![](/images/graemlins/lol.gif)
Только сейчас посмотрел зачем нужен <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.
То есть часть целого не входит в целое.
Ты думай, что пишешь-то!
![](/images/graemlins/lol.gif)
Думай над тем что читаешь и не вырывай фразы из контекста.
http://en.wikipedia.org/wiki/POSIX
Ссылку ты привёл не самую лучшую. Всё таки у POSIX есть свой собственный первоисточник в интернете. Однако и из этой ссылки можно почерпнуть полезную информацию. А именно:
Стандарты POSIX развиваются. Кроме того, есть несколько отдельных стандартов, покрывающих отдельные куски функциональности ОС. Из всех Windows только NT прошла сертификацию на real-time extensions, и очевидно, что это было давно. Практической пользы на сегодняшний день от этого нет, но можно вот на форумах заявлять, что Windows соответствует POSIX. Умалчивая о какой виндовз речь и о каком именно стандарте POSIX речь, и какого года.
> Не очень понял, что ты хотел сказать. Ссылку ты привёл не самую лучшую. Всё таки у POSIX есть свой собственный первоисточник в интернете. Однако и из этой ссылки можно почерпнуть полезную информацию. А именно:
Стандарты POSIX развиваются. Кроме того, есть несколько отдельных стандартов, покрывающих отдельные куски функциональности ОС. Из всех Windows только NT прошла сертификацию на real-time extensions, и очевидно, что это было давно. Практической пользы на сегодняшний день от этого нет, но можно вот на форумах заявлять, что Windows соответствует POSIX. Умалчивая о какой виндовз речь и о каком именно стандарте POSIX речь, и какого года.
> другое дело - это "моделировать реальность".Хорошо, объекты в БД, с которыми постоянно идёт работа - этим тоже функциональщики занимаются?
Как часто тебе приходилось моделировать реальность?
Да, потому что никогда раньше он мне нафиг не был нужен.
> Не говоря уже о том что стандарт в жизни своей не открывал.
У меня есть стандарт де-факто, мне хватает.
> а мне кажется вполне достаточным "C"
> (которое по определению ссылается на стандарт языка C).
А мне это не только не кажется, но ещё и вредно.
Потому что в твоём стандарте описано то, что не может существовать в условиях отсутствия файловой системы.
А в последнее время у меня наблюдается именно это.
И это именно си.
Но без заморочек с кучей заголовочных файлов.
И уж тем более --- со стандартной библиотекой,
которая не работает и даже бесполезна большей частью.
>>> У меня не было заявления, что "библиотека входит в язык",
>>> у меня было заявление, что стандартная библиотека языка C,
>>> которая описывается в стандарте языка C,
>>> является частью языка C.
>> То есть часть целого не входит в целое.
>> Ты думай, что пишешь-то!
> Думай над тем что читаешь и не вырывай фразы из контекста.
Я перечитал отмеченное тремя знаками ">" ещё раз.
Мне ещё раз повторить отмеченное двумя знаками?
---
"Студенту надо повторять всё три раза, Ганс. Три раза. Запомни, Ганс: три раза."
ложится на функциональную парадигму хорошо.
---
...Я работаю антинаучным аферистом...
> Только сейчас посмотрел зачем нужен <stddef.h>?Ну а зачем тогда уже не первые сутки разговаривать о стандартной библиотеке C, если тебе о ней мало что известно и вообще она тебя не интересует?
Да, потому что никогда раньше он мне нафиг не был нужен.
> а мне кажется вполне достаточным "C"Это не мой стандарт
> (которое по определению ссылается на стандарт языка C).
А мне это не только не кажется, но ещё и вредно.
Потому что в твоём стандарте описано то, что не может существовать в условиях отсутствия файловой системы.
А в последнее время у меня наблюдается именно это.
И это именно си.
Но без заморочек с кучей заголовочных файлов.
И уж тем более --- со стандартной библиотекой,
которая не работает и даже бесполезна большей частью.
![](/images/graemlins/grin.gif)
Но с тем фактом, что определением языка C является стандарт языка C, пожалуй стоит смириться.
Именно для случая отсутствия файловой системы и т.п. и придумана freestanding implementation. Если ты программируешь на C все же рекомендую почитать стандарт, ибо разработчики компиляторов именно на него опираются, не говоря уже о том, что станет понятно как писать портируемые программы (эти несколько заголовочных файлов freestanding implementation совсем не бесполезны, хотя функций вроде не содержат).
Я перечитал отмеченное тремя знаками ">" ещё раз.Ну зачем ты тут дурачка строишь?
Мне ещё раз повторить отмеченное двумя знаками?
Перечитай не то, что ты изволил вырвать из контекста, а оригинальный пост - весь абзац целиком.
Что за манера вообще в дискуссии вырывать фразы из контекста? Это что нервное?
Может мне твои посты раздробить на отдельные буковки, составить из них и запостить "Войну и мир", какую-нибудь?
> если тебе о ней мало что известно и вообще она тебя не интересует?
Мне известно достаточно.
Внутренности libc я немного знаю.
> Но с тем фактом, что определением языка C является стандарт языка C,
Какой стандарт?
K&R --- это тоже стандарт.
> ибо разработчики компиляторов именно на него опираются,
Наглая ложь.
> не говоря уже о том, что станет понятно как писать портируемые программы
Я и без тебя знаю, что такого не может быть.
---
...Я работаю антинаучным аферистом...
> составить из них и запостить "Войну и мир", какую-нибудь?
Давай.
"Войну и мир."
Укажешь перестановку, с помощью которой ты этого добился.
Я проверю.
---
...Я работаю антинаучным аферистом...
Мне известно достаточно.ну конечно, только про stddef.h не знаешь почему-то? А про limits.h знаешь? (это гораздо интереснее stddef.h)
Внутренности libc я немного знаю.
Знание внутренностей libc не имеет отношения к знанию стандартной библиотеки. Если бы знал стандарт понимал бы это. В юниксовых libc помимо стандартной библиотеки разумеется поддержка POSIX API и прочих дополнительных расширений не говоря уже о том, что у каждой частной реализации есть своя специфика, а знание стандартной библиотеки подразумевает знание того, какая функциональность - стандартная, а какая - расширение.
Какой стандарт?Это не стандарт.
K&R --- это тоже стандарт.
Это 2 человека: Брайан Керниган и Деннис Риччи, которые кроме того, что оригинальные авторы языка, еще к тому же принимают участие в разработке стандарта. А второе издание их книги как раз описывает первый стандарт C 1989 года. (А первое издание этой же книги и является единственным "стандартом" K&R C).
> ибо разработчики компиляторов именно на него опираются,Ох ну как же я мог забыть про разработчиков, писавших компиляторы C в далекие 80е годы до выхода стандарта.
Наглая ложь.
> не говоря уже о том, что станет понятно как писать портируемые программы"Narrowness of experience leads to narrowness of imagination." (це)
Я и без тебя знаю, что такого не может быть.
Он мне не нужен.
> А про limits.h знаешь? (это гораздо интереснее stddef.h)
Расскажи, зачем он мне нужен.
> Это не стандарт.
Де-факто стандарт --- тоже стандарт.
> Ох ну как же я мог забыть про разработчиков,
> писавших компиляторы C в далекие 80е годы
http://onboardc.sf.net
---
"Narrowness of experience leads to narrowness of imagination."
#ifndef WIN32
#error program requires Windows
#endif
#include <windows.h>
...
![](/images/graemlins/smile.gif)
Если серьезно. Почему-то не кросс-платформенный 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'ов не будет.
Так же разработчики открытых проектов частенько не осознают, что их программу будут компилировать в враждебной windows, на которой будет установлен лишь C/C++, а никаких интерпретаторов/компиляторов perl'a, ruby'a, python'a, nasm'a и никаких cygwin'ов не будет.Не согласен. В любом случае необходимы какие-то библиотеки-обвязки, чтобы можно было работать платформенно-независимо с графикой, сообщениями, сетью и т.п. Поэтому просто компилятора заведомо не хватит на что-то отличное от консольного и несетевого - или программа должна содержать специфический для платформы код, или должны быть установлены дополнительные средства (библиотеки или что-либо ещё).
В любом случае необходимы какие-то библиотеки-обвязки, чтобы можно было работать платформенно-независимо с графикой, сообщениями, сетью и т.п.Для этого есть динамическая линковка.
А эти библиотеки - они тоже во всех ОС разные. Если ты, конечно, не содержишь в себе эмулятор ОС.
Оставить комментарий
Sharp
Ибо с самого начала надо учиться делать правильно.А то потом будет труднее переучиваться.
Вот так люди привыкают, что все всегда работает, что malloc и fopen всегда возвращает не NULL...
А если вдруг ихние программы попытаться запустить на другой машине, с другой архитектурой, с другой OC, то тогда можно выяснить, что и у int-а бывает разный размер, что функции getch просто нету, ровно как и библиотеки <conio.h>