Я ни сколечки не лоулевел програмист, и на сигнатуре функции malloc моя экспертиза в нём заканчивается.
Но.
В худшем случае реаллок правда, если правильно понимаю, может быть дороже маллока, так как в первом может произойти мемкопи сверху обычной аллокации. Вот, например, как это имплеменировано в glibc.
А в остальном я, если честно, потерял нить беседы, поэтому на этом комментарии ограничусь))
Ну да, эдакий зверь. Забавно, что если толкать массив через указатель на массив в сях, то проверка типа и sizeof будет работать, как положено. Хотя синтакс при этом, конечно, несколько усложняется без нормальной на то причины - https://godbolt.org/z/c8KT7EPM8. Не совсем прозрачно, почему такой же тайпчек нельзя было сделать и без бубнов с указателем на сам массив)
Кстати, говоря о constexpr - в качестве оффтопа вспомнил соревнование по простым числам на канале Dave's Garage, где один умелец сделал версию, работающую в компайл-тайме, которая, формально, вроде как победила)
Хорошее замечание, спасибо! Но там придётся либо зашивать размер в сигнатуру, либо передавать его параметром. Второй случай получается идентичным передаче по указателю.
Ну да, хвост появится, если элементов останется меньше, чем размер векторного регистра. Вполне возможно, этот хвост тоже обработается через одну векторную операцию, если в наборе инструкций есть шафл вектора.
Ну да, в чистых сях массив как таковой, фактически, и нельзя передать как параметр. В плюсах можно толкнуть именно встроенный массив как таковой по ссылке. Компиляторы хорошо это понимают. У меня есть пример в статье, где GCC не векторизовал это на O2, но это, скорее, просто интересная особенность.
Давеча закончил отличную игрульку Plague's Tale: Requiem, там в конце была фраза "All natural laws end here". Мне кажется, к UB она подходит замечательно)
Строго говоря, начать печатать стек можно и с обычным массивом. В моей прошлой статье был вот такой пример подобного.
Спасибо, что вернулись дописать комментарий) Рад, что статья понравилась!
Использовать односвязный список и аллоцировать каждую ноду через malloc?
Нет разработчиков - нет багов!)
Ну да, аллокация в масисвах - это немного неортодоксально)
Типо, аллокацию как в `std::vector`?
Я ни сколечки не лоулевел програмист, и на сигнатуре функции malloc моя экспертиза в нём заканчивается.
Но.
В худшем случае реаллок правда, если правильно понимаю, может быть дороже маллока, так как в первом может произойти мемкопи сверху обычной аллокации. Вот, например, как это имплеменировано в glibc.
А в остальном я, если честно, потерял нить беседы, поэтому на этом комментарии ограничусь))
Побоюсь про VLA что-нибудь говорить)
Ну да, эдакий зверь. Забавно, что если толкать массив через указатель на массив в сях, то проверка типа и sizeof будет работать, как положено. Хотя синтакс при этом, конечно, несколько усложняется без нормальной на то причины - https://godbolt.org/z/c8KT7EPM8. Не совсем прозрачно, почему такой же тайпчек нельзя было сделать и без бубнов с указателем на сам массив)
О, это моё)
Кстати, говоря о
constexpr
- в качестве оффтопа вспомнил соревнование по простым числам на канале Dave's Garage, где один умелец сделал версию, работающую в компайл-тайме, которая, формально, вроде как победила)https://github.com/PlummersSoftwareLLC/Primes/tree/drag-race/PrimeCPP/solution_3
Спасибо!
Но тогда нельзя будет кастомизировать размер массива. Ну и в целом, на O3 GCC оптимизировал на ура.
Хорошее замечание, спасибо! Но там придётся либо зашивать размер в сигнатуру, либо передавать его параметром. Второй случай получается идентичным передаче по указателю.
Тогда массив будет копироваться при передаче, это дорого.
Не, ну я же не рентв)
Ну да, хвост появится, если элементов останется меньше, чем размер векторного регистра. Вполне возможно, этот хвост тоже обработается через одну векторную операцию, если в наборе инструкций есть шафл вектора.
Ну да, в чистых сях массив как таковой, фактически, и нельзя передать как параметр. В плюсах можно толкнуть именно встроенный массив как таковой по ссылке. Компиляторы хорошо это понимают. У меня есть пример в статье, где GCC не векторизовал это на O2, но это, скорее, просто интересная особенность.
То есть, руками векторизовали этот кусок - `dst[i] = src[i] + n;`, и в нём пессимизация случилась? А можно на весь цикл посмотреть?
А ссылки на массивы я тоже смотрю, только пониже в статье)
Статья по факту про simd, тут ускорение за счёт нескольких операций за раз получается.
Без векторов сама по себе операция чтения по индексу у обоих одинаковая выходит.
Давеча закончил отличную игрульку Plague's Tale: Requiem, там в конце была фраза "All natural laws end here". Мне кажется, к UB она подходит замечательно)
Строго говоря, начать печатать стек можно и с обычным массивом. В моей прошлой статье был вот такой пример подобного.