Я думаю о следующей проблеме: Я хочу запрограммировать микроконтроллер (скажем, тип AVR мега) с программой, которая использует какие-то таблицы поиска.Как заставить GCC оценивать функции во время компиляции?
Первой попыткой было бы найти таблицу в отдельном файле и создать ее с использованием любого другого языка/программы для сценариев/.... В этом случае необходимо приложить необходимые исходные файлы для C.
Теперь я думал использовать препроцессор и компилятор для обработки вещей. Я пытался осуществить это с помощью таблицы синусов значений (только в качестве примера):
#include <avr/io.h>
#include <math.h>
#define S1(i,n) ((uint8_t) sin(M_PI*(i)/n*255))
#define S4(i,n) S1(i,n), S1(i+1,n), S1(i+2,n), S1(i+3,n)
uint8_t lut[] = {S4(0,4)};
void main()
{
uint8_t val, i;
for(i=0; i<4; i++)
{
val = lut[i];
}
}
Если я скомпилировать этот код я получаю предупреждение о функции sin
. Далее в сборке ничего нет в разделе .data
. Если я просто удалю sin
в третьей строке, я получу данные в сборке. Очевидно, что вся информация доступна во время компиляции.
Можете ли вы сказать мне, есть ли способ достичь того, что я намерен: компилятор вычисляет столько значений, сколько возможно в офлайн-режиме? Или это лучший способ использовать внешний скрипт/программу/... для вычисления записей в таблице и добавления их в отдельный файл, который будет только #include
d?
«довольно много усилий». - с хорошим скриптингом язык? конечно, меньше, чем атаковать проблему с C .... –
C++ 11 (улучшенный с C++ 14) имеет 'constexpr' как подсказку компилятору для выполнения функции во время компиляции. – johannes
@johannes: 'constexpr' не является преимуществом. Это просто _allows_ выражение, которое оценивается во время компиляции (и даже принуждение к нему компилятора, например, путем присвоения перечислению, не мешает повторной оценке во время выполнения в другом месте в том же исходном файле!). Он не обеспечивает и не намекает на что-либо. Тем не менее, мой GCC оптимизирует фрагмент кода в OP просто отлично в таблицу поиска с оценкой (без специального специального танца). – Damon