2013-05-27 13 views
6

Byłem pod wrażeniem, aby zobaczyć ostatni przykład w Todd Veldhuizen's metaprogramming guide, gdzie funkcje trig jak sin i cos są wstępnie obliczane w czasie kompilacji. Szczerze powiedziawszy to mnie odstraszyło i jeśli piszesz kod, który wykonuje ogromną liczbę tych w pętlach, tak jak ja, to może to mieć istotny wpływ na zwiększenie wydajności.Jakie operatory matematyczne są dostępne w metaprogramowaniu

Pytanie 1

Jednak to doprowadziło mnie do zastanawiać, gdzie linia jest rysowana między tym, co jest dostępne jako narzędzie run-time (wywołanie rzeczywistych funkcji bibliotecznych matematyka jak sin lub cos) i to, co jest dostępne tylko operator matematyki w czasie kompilacji.

Przykład Todda wymaga ręcznego obliczenia funkcji wyzwalania za pomocą zwykłej arytmetyki.

jestem założyć następnie, że kompilator jest w stanie wszystkich zwykłych funkcji matematycznych *+-/ ale nic innego?

Pytanie 2

W takim przypadku, można by tylko być w stanie uzyskać wyniki kompilacji dla sin i cos obliczeń na liczbach całkowitych, prawda? Oznacza to, że nie można wstępnie skompilować wyniku czegoś podobnego do sin 45.5, prawda?

Albo jeśli szablon może przyjąć jedynie liczb całkowitych jako parametrów, można podjąć kilka liczb całkowitych i zrobić float z nich w klasie, jak przepływające 123 i podejmowania 1.23 uzyskać sin o wartości typu float.

Odpowiedz

2

Pytanie 1

Jednak to doprowadziło mnie do zastanawiać, gdzie linia jest rysowana między tym, co jest dostępne jako narzędzie run-time (wywołanie rzeczywistych funkcji bibliotecznych matematyka jak sin lub cos) i to, co jest dostępne tylko operator matematyki w czasie kompilacji.

  • nazwane funkcje mogą być wykorzystywane wyłącznie na compiletime jeśli są one zadeklarowane constexpr, przestrzegać zasad constexpr i nazywane są ze stałymi compiletime.
  • Typy danych zdefiniowanych przez użytkownika mogą być używane podczas kompilacji tylko wtedy, gdy są konstruowane za pomocą konstruktorów constexpr ze stałych kompilacji.
  • Każdy wbudowany operator, który działa na wbudowanych typach stałych, zapewnia stałą czas kompilacji.
  • Każda konwersja typu między wbudowanymi daje stałą czasu kompilacji, jeśli oryginał jest stałą kompilacji.

Tak, to nie jest ograniczony do czterech operatorów matematycznych, można użyć % i innych operatorów, a także, jak również metafunkcji szablon i constexpr wyrażeń.

Pytanie 2

W takim przypadku, można by tylko być w stanie uzyskać wyniki kompilacji dla grzechu i cos obliczeń na liczbach całkowitych, prawda? Oznacza to, że nie można wstępnie skompilować wyniku czegoś podobnego do grzechu 45.5, prawda?

Tak i nie. W C++ 03 jesteś ograniczony do wbudowanych i metafunkcji szablonów, constexpr jest niedostępny. Dlatego sin musi być metafunkcja szablonu, która może działać tylko na stałych stałych, ponieważ typy zmiennoprzecinkowe nie są dozwolone w szablonach. Można jednak zdefiniować szablony dla ułamków lub stałych punktów i wymyślić dla nich szablon sin. Byłoby to dość nudne i mógłbyś z łatwością przejść do ograniczeń związanych z tworzeniem szablonów.

Od C++ 11 można pisać funkcje constexpr, które pobierają parametry zmiennoprzecinkowe i pracują z nimi.

+1

Do obliczania sinusa w czasie kompilacji z ekspansją szeregową patrz http://www10.informatik.uni-erlangen.de/~pflaum/pflaum/ProSeminar/meta-art.html – jmihalicza

Powiązane problemy