УДК 004 Гылыджова М., Ишангулыев А., Аннагылыджов Р.
Гылыджова М.
Туркменский государственный архитектурно-строительный институт
(г. Ашхабад, Туркменистан)
Ишангулыев А.
Туркменский государственный архитектурно-строительный институт
(г. Ашхабад, Туркменистан)
Аннагылыджов Р.
Туркменский государственный архитектурно-строительный институт
(г. Ашхабад, Туркменистан)
ПРЕИМУЩЕСТВА И НЕДОСТАТКИ ИСПОЛЬЗОВАНИЯ C++ В СОВРЕМЕННОМ ПРОГРАММИРОВАНИИ ВСТРАИВАЕМЫХ СИСТЕМ
Аннотация: в данной статье речь идёт об использовании С++ в программировании встраиваемых систем, сравнение С и С++, а также приводятся примеры некоторых кодов, приспосабливающих С+ + к встроенным системам.
Ключевые слова: программирование встроенных систем, коды, принцип нулевых
затрат.
Использование языка программирования C++ для разработки встраиваемых систем неуклонно растет, хотя язык программирования C по-прежнему является предпочтительным (на него приходится до 65% встраиваемых систем).
При предполагаемом 20-30 % использовании в области разработки встраиваемых систем C++ предлагает улучшенную безопасность типов и функции качества жизни, такие как циклы for на основе диапазона, ключевое
слово auto и лямбда-выражения. Несмотря на возможности, которые предлагает C++, многие компании и отдельные разработчики встраиваемых систем по-прежнему придерживаются старых способов программирования на C. И объяснение этому простое: огромный объем разработок встраиваемых систем связан с критически важными с точки зрения безопасности приложениями: автомобильными, медицинскими, бытовыми приборами, управляющими нагревательными элементами, и многими другими. В глазах многих разработчиков встраиваемых систем Стандартная библиотека C++ печально известна своим динамическим распределением памяти. Основным ограничением для критически важных для безопасности приложений и систем с ограниченными ресурсами является отсутствие динамического выделения памяти.
Помимо динамического выделения памяти, существуют и другие проблемы, связанные с использованием C++ во встроенных проектах, которые необходимо решить.
Другой распространенный аргумент против C++ заключается в том, что он добавляет некоторые механизмы, раздувающие код, что особенно важно для систем с ограниченной памятью, где важен каждый килобайт. И это справедливо для механизма исключений и RTTI (информация о типе времени выполнения), где компилятор добавляет некоторую дополнительную информацию в двоичный файл, чтобы сделать эти механизмы возможными.
Исторически C++ начинался как «C с классами». Первый компилятор C++ Cfront преобразовал C++ в C, но это было очень давно. Со временем C и C++ развивались отдельно и теперь определяются отдельными языковыми стандартами. Это приводило к случаям, когда код, действительный как на C, так и на C++, при компиляции давал разные результаты. Эти случаи редки и весьма специфичны, и они хорошо документированы.
C++ и динамическое распределение памяти
Примеры кода C++ из учебников, использующие std::string и std::ostream демонстрируют, почему большинство разработчиков
встраиваемых систем даже не рассматривают C++ в своей работе. И std::string, и std::ostream (std::cout) используют динамическое распределение памяти. Что происходит, когда внутренний буфер ostream заполнен? Вероятно, он выделяет память для обработки этого случая. Когда вы объединяете строки, std::string динамически выделяет память для размещения полученной строки. Подробнее о строках в C++ высказался программист Найл Кулинг.
В своей статье Найл обсуждает влияние std::string на память. Он также объясняет std::string_view и std::pmr (C++17). Ресурс полиморфной памяти (PMR) позволяет указать фрагмент памяти, который будет использоваться строкой в стеке. Если запрос буфера превышает размер буфера, программа завершится.
Стандартная библиотека C++ предлагает набор классов шаблонов контейнеров и алгоритмов, которые можно использовать в этих контейнерах. Большинство этих контейнеров используют динамическое распределение памяти. Однако есть исключение: std:: array - это контейнер, инкапсулирующий массивы фиксированного размера. Он обеспечивает несколько преимуществ по сравнению с массивами в стиле C:
1. Метод .at() выполняет проверку границ, что предотвращает неправильную индексацию — ошибку, которая может случиться даже с опытными разработчиками встроенных систем.
2. Информация о размере: std::array знает свой размер, т. е. несёт с собой информацию о своем размере. Вы можете использовать функцию .size(), чтобы получить количество элементов в массиве.
3. Обеспечивает совместимость с алгоритмами стандартной библиотеки, такими как std::find, std:: find_if, std::find_if_not, std::copy, std::copy_if и другими.
#define N 20
int buffer[N] = {0},
for(int i = 0, i < N, i ++) {
printf("%d ", buffer[i]),
}
Приведенный выше фрагмент кода C можно преобразовать в следующий код C++:
std::array<int, 20> buffer = {0},
for(auto& element : buffer) {
printf("%d ", element), }
В приведенном выше примере используется диапазон циклов, что упрощает чтение кода. В целом, std::array представляет собой более современную, безопасную и более выразительную альтернативу массивам в стиле C, сохраняя при этом характеристики производительности и памяти массивов в стиле C.
СПИСОК ЛИТЕРАТУРЫ:
1. Teach yourself C++ in 21 days. J.Liberty, B.Jones. 2004;
2. Современный С++ в развитии встроенных систем. А. Махмутбегович. 2023;
3. Working with Strings in Embedded C++. N. Cooling. 2023
Gylyjova M., Ishangulyev A., Annagylyjov R.
Gylyjova M.
Turkmen State Architecture and Construction Institute (Ashgabat, Turkmenistan)
Ishangulyev A.
Turkmen State Architecture and Construction Institute (Ashgabat, Turkmenistan)
Annagylyjov R.
Turkmen State Architecture and Construction Institute (Ashgabat, Turkmenistan)
ADVANTAGES AND DISADVANTAGES OF USING C++ IN MODERN EMBEDDED SYSTEMS PROGRAMMING
Abstract: article discusses the use of C+ + in embedded systems programming, compares C and C++, and also provides examples of some code that adapts C++ to embedded systems.
Keywords: embedded systems programming, codes, zero-cost principle.