Как мне вызвать opendir без использования памяти mallo c? - PullRequest
2 голосов
/ 28 февраля 2020

Только для образовательных целей, я пишу C программу без каких-либо mallo c, и я проверяю, не используется ли куча, используя mallinfo (). Uordblks . Я заметил, что функция opendir вызывает огромный всплеск памяти mallo c в соответствии с mallinfo, и я не уверен почему. Мне интересно, есть ли способ дать opendir выделенный стеком буфер, чтобы делать то, что ему нужно, чтобы я мог этого избежать (аналогично setvbuf, который я использовал, чтобы избежать буферизации в куче для stdout / stderr) , В основном, как мне прочитать содержимое каталога без использования памяти, выделенной в куче? . Если это имеет значение, я на Linux машине.

1 Ответ

3 голосов
/ 28 февраля 2020

Вы не можете, больше, чем вы могли бы использовать stdio без возможности, что он вызывает malloc, или аналогично многим другим компонентам в lib c. По сути, нет никаких причин, по которым ни одна из стандартных функций библиотеки не может использовать malloc для внутреннего использования, хотя для многих это должно быть условно с запасными путями (потому что они не могут потерпеть неудачу или потому что они должны быть асинхронными c -signal-safe, et c.) И для лотов для них не имеет никакого смысла делать это в разумной реализации.

В любом случае, поскольку в отличие от stdio (где вы можете вместо этого выполняйте низкоуровневые операции fd) не существует переносимого API доступа к каталогу, который обычно не реализуется с помощью объекта буфера пользовательского пространства (DIR), вы должны либо признать, что он использует malloc или go с не Переносимый интерфейс нижнего уровня (на Linux, системный вызов SYS_getdents64).

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

...