Я планирую использовать программируемую плату Arduino . У них достаточно ограниченная флэш-память в диапазоне от 16 до 128 кБ для хранения скомпилированного кода C или C ++.
Есть ли способы оценить , какой (стандартный) код он будет представлять?
Полагаю, это очень расплывчато, но я ищу только на порядок.
Вы действительно не можете сказать там. Длина некомпилированного кода мало связана с длиной скомпилированного кода. Например:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
std::vector<std::string> strings;
strings.push_back("Hello");
strings.push_back("World");
std::sort(strings.begin(), strings.end());
std::copy(strings.begin(), strings.end(), std::ostream_iterator<std::string>(std::cout, ""));
}
vs
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
std::vector<std::string> strings;
strings.push_back("Hello");
strings.push_back("World");
for ( int idx = 0; idx < strings.size(); idx++ )
std::cout << strings[idx];
}
Оба имеют одинаковое количество строк и производят одинаковый вывод, но первый пример включает создание экземпляра std :: sort, который, вероятно, на порядок больше кода, чем остальные кода здесь.
Если вам абсолютно необходимо подсчитать количество байтов, использованных в программе, используйте ассемблер.
Это довольно много для достаточно сложной программы, но вы начнете сталкиваться с пределом, если хотите, чтобы у нее было много различных функций. Кроме того, если вы хотите хранить довольно много статических строк и данных, они могут быстро их съесть. Но для встраиваемых приложений 32 КБ - это приличный объем. Как правило, в первую очередь у вас возникают проблемы с оперативной памятью!
Кроме того, довольно часто компиляторы C ++ для встраиваемых систем намного хуже компиляторов C. То есть они нигде не так хороши, как компиляторы C ++ для обычных настольных ОС (с точки зрения создания эффективного машинного кода для целевой платформы).
Загрузите IDE arduino и «проверьте» часть существующего кода или просмотрите образцы эскизов. Он скажет вам, сколько байтов в этом коде, что даст вам представление о том, сколько еще байтов вы можете уместить на данном устройстве. Выбрав пару примеров наугад, пример веб-сервера имеет размер 5816 байт, а LCD hello world - 2616 байт. Оба используют внешние библиотеки.
В системе Linux вы можете поэкспериментировать со статическими скомпилированными примерами программ. Например.
$ size `which busybox `
text data bss dec hex filename
1830468 4448 25650 1860566 1c63d6 /bin/busybox
Размеры указаны в байтах. Этот вывод не зависит от формата исполняемого файла, поскольку размеры различных разделов внутри формата файла. Текстовая секция содержит машинный код и const stufff. Раздел данных содержит данные для статической инициализации переменных. Размер bss - это размер неинициализированных данных - конечно, неинициализированные данные не нужно хранить в исполняемом файле.)
Что ж, busybox содержит множество функций (как и все обычные команды оболочки, оболочка и т. д.).
Если вы связываете собственные примеры с помощью gcc -static , имейте в виду, что используемая вами библиотека libc может значительно увеличить размер программы и что использование встроенной библиотеки может быть намного более экономичным.
Чтобы проверить это, вы можете проверить diet-libc или uclibc и дать ссылку на него. На самом деле, busybox обычно связан с uclibc.
Обратите внимание, что размеры, которые вы получаете таким образом, дают вам только порядок величины . Например, ваша рабочая станция, вероятно, использует другую архитектуру ЦП, чем плата Arduino, и машинный код другой архитектуры может более или менее отличаться по размеру (из-за размеров операндов, доступных инструкций, кодировки кода операции и т. Д.).
Продолжая приблизительные рассуждения , busybox содержит примерно 309 инструментов (включая демон ftp и тому подобное), то есть средний размер кода инструмента busybox примерно равен 5к.