나는 다음과 같은 문제에 대해 생각하고있다. 어떤 종류의 룩업 테이블을 사용하는 프로그램으로 마이크로 컨트롤러 (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