Pull to refresh

Comments 28

Что мы получили кроме дикого оверхеда?

Меня больше интересует другое: аккаунт создан 3 октября 2012 г., последняя активность 04.06.2021, ни одной публикации или комментария. И тут опа: и публикация. Такое вообще бывает?

Вопрос в том, как долго статья была в песочнице.

Наткнулся кто-то на эту статью и решил пригласить.

Учитывая что подпись автора говорит, что он разработчик DL и NLP, то вполне вероятно так и есть)

если знать, как работают внутренности C на низком уровне

... то можно воспользоваться mmap(MAP_ANONYMOUS) или там VirtualAlloc(). malloc же берет память где-то?

Есть, но им лучше не пользоваться.

UFO just landed and posted this here

сам sbrk ничего не выделяет, а сдвигает границу адресного пространства кучи, доступной процессусам sbrk ничего не выделяет, а сдвигает границу адресного пространства кучи, доступной процессу

... что впринципе и является выделением памяти, ведь мы получаем больше виртуальных адресов для использования.

В линуксе вниз граница не двигается, в этом смысле предпочтительнее ммап- выделенную им память можно отдать обратно ос.

UFO just landed and posted this here

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

UFO just landed and posted this here

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

UFO just landed and posted this here

Так речь же о том, что без malloc обойтись. А остальные детали в данном случае не интересны.


Ну то есть вместо выделения куска памяти в куче с помощью malloc (или его собственной реализации) просто инкрементируем указатель на память.

UFO just landed and posted this here

Ну аффтар же сказал "без кучи". Без кучи единственный вариант рекурсия. Так себе троллинг впрочем ...

Выделение памяти через mmap() не имеет прямого отношения к куче. То есть, конечно, можно в выделенной памяти потом завести heap allocator, но ведь можно и не заводить.

Так С или плюсы?

Ничего, что под массивом в мире С/С++ понимается непрерывный участок памяти, а список - это другое? И одно второе не заменяет.

UFO just landed and posted this here

Чтобы идея стала законченной, можно все тоже сделать, но без циклов?

Не хватает коментария от автора: извините, меня взломали.

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

Я тут перед собеседованиями заново проштудировал структуры данных и алгоритмы, и понял, что основательно их подзабыл :(

1. Прочитайте, что такое массив. // Тут не выполняется даже доступа по индексу за O(1).
2. Прочитайте, что происходит со стеком после завершения функции. // Скорее всего, данные там останутся, но вызов функции перетрёт значения.

В целом пост, конечно, безграмотный, как и было сказано в предыдущих комментариях. Но есть в нём одна разумная мысль:

Списки, в отличие от массивов, не владеют элементами. Список это, скорее, способ упорядочивания относительно независимых наборов данных. Поэтому элементы списка могут иметь разный размер и выделяться где угодно, в частности, на стеке. Главное - гарантировать удаление элемента из списка до того, как будет удалён "носитель".

Лично я использую выделение отдельных элементов списка на стеке довольно регулярно, особенно в многопоточных алгоритмах.

Массив и отличается от списка хотя бы тем, что доступ к любому элементу требует одинакового времени - адрес нулевого элемента плюс номер умножить на размер элемента (сори за банальность). У вас список с оператором индексации.
Ну и не совсем в тему, но VLA есть в C99, например.

Sign up to leave a comment.

Articles