
OSDEV: Itanium ABI часть 1: Array Operator new Cookies
GNU_Dimarik 3 минуты назад OSDEV: Itanium ABI часть 1: Array Operator new Cookies 8 мин 20 C * C++ * Приветствую!Код тутВ этом цикле статьей я рассмотрю весь путь реализации минимального Itanium ABI для своей ОС....
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
В сфере искусственного интеллекта произошло заметное событие. GNU_Dimarik 3 минуты назад OSDEV: Itanium ABI часть 1: Array Operator new Cookies 8 мин 20 C * C++ * Приветствую! Код тутВ этом цикле статьей я рассмотрю весь путь реализации минимального Itanium ABI для своей ОС. Исключения не поддерживаются.
Вопросы разработки юнванйдера в этоих статьях рассмотрены не будут. Этапы разработки osdev-libstc подробно рассмотрены в следующих статьях:vsnprintf spin_lock malloc/free/realloc/alloc_aligned В статье про аллокаторы есть ссылка на цикл статей с пояснениям алгоритма и полной его реализацией. Все функции о которых пойдет речь должны быть объявлены в пространстве имен __cxxabiv1 и должны быть extern "C".
Технические детали
Array Operator new CookiesСразу скажу что в итоге оказалось что современные компиляторы не используют эти АПИ, по крайней мере свежий GCC точно (на момент написания статьи последний стабильный релиз GCC 16. 1) но тем не менее раз уж Itanium требует наличия этих функций в ABI я реализовал их. An ABI-compliant system shall provide several runtime routines for use in array construction and destruction что означает, что совместимый с Itanium рантайм обязан предоставить реализацию этих функций.
Не смотря на это требование компилятор может вызывать или не вызывать их по своему усмотрению. Современные компиляторы способны генерировать эквивалентный и скорее всего более быстрый код самостоятельно. Поговорим о функциях конструирования массивов.
Их реализация довольно простая, особенно если понимать что происходит. Рассмотрим каждую по отдельности на примере их реализации в библиотеке osdev-libcppabi. Эти функции можно условно разделить на три группы:создание массива __cxa_vec_new* работа с элементами массива __cxa_vec_ctor, __cxa_vec_cctor, __cxa_vec_dtorуничтожение массива __cxa_vec_delete* __cxa_vec_ctor Не распределяет память.
Отраслевые последствия
Просто вызывает конструкторы для объектов в массиве в порядке их следования от 0 до __element_count. Конструктор и размер массива само собой передаются компилятором. Деструктор передается на тот случай если один из конструкторов бросил исключение.
В этом случае уже сконструированные объекты должны быть удалены. osdev-libcppabi не поддерживает исключения, поэтому параметр __destructor просто игнорируется__cxa_vec_ctor_return_type __cxa_vec_ctor( void *__array_address, size_t __element_count, size_t __element_size, __cxa_cdtor_type __constructor, __cxa_cdtor_type __destructor ]) { if (__constructor) { auto __c = static_cast (__array_address); // конструкторы вызываем сначала массива к его концу // самый обычный цикл for (size_t __i = 0; __i < __element_count; ++__i) { __constructor(__c); __c += __element_size; } } }__cxa_vec_cctor Эта функция может быть вызвана когда нужно проинициализировать массив конструктором копирования. В остальном полностью аналогична функции выше.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





