Przykłady ciągów C++ Constexpr

Przyklady Ciagow C Constexpr



W tym artykule omówimy constexpr, znaczący dodatek do języka programowania C++, który został wprowadzony w C++ 11 i udoskonalony w C++ 14 i sygnalizuje kompilatorowi, że zmienna, funkcja lub konstruktor obiektu jest konstruktorem kompilacji. stała czasowa. Zrewolucjonizowało to sposób, w jaki programiści tworzą stałe i manipulują nimi. Dzięki constexpr programiści mogą definiować wyrażenia i wartości, które są niezmienne i oceniane podczas kompilacji, a nie w czasie wykonywania. Nadrzędną korzyścią z włączenia constexpr do kodu jest gwarancja stałości.

Jakie jest zastosowanie ciągu C++ Constexpr?

Korzystanie z constexpr może prowadzić do bardziej kompaktowych i zoptymalizowanych plików wykonywalnych. Ponieważ wartości są określane z wyprzedzeniem przez kompilator, powstałe pliki binarne mogą być mniejsze, co pozwala na bardziej ekonomiczne wykorzystanie zasobów systemowych, co z kolei może zwiększyć wydajność oprogramowania na różnych platformach. Szczególną i znaczącą zaletą tej funkcji jest ograniczenie obliczeń w czasie wykonywania. Ponieważ wartości są obliczane podczas procesu kompilacji, gdy jest to możliwe, ocena środowiska wykonawczego staje się mniej konieczna. To zwiększenie wydajności nie tylko przyspiesza wykonanie, ale także usprawnia ogólne działanie programu.

Przykład 1: Używanie Constexpr w C++ do obliczeń silniowych

W tym przykładzie użyjemy constexpr, który umożliwia wykonywanie obliczeń w czasie kompilacji, a nie w czasie wykonywania. W kontekście obliczania silni do obliczania wartości silni podczas kompilacji można wykorzystać typową operację matematyczną, jaką jest constexpr. Przeanalizujmy i przejrzyjmy następujący kod, a następnie przyjrzyjmy się wyjaśnieniu kodu:







#include

constexpr wew silnia ( wew N ) {

powrót N <= 1 ? 1 : ( N * silnia ( N - 1 ) ) ;

}

wew główny ( ) {

wew na jednego = 5 ;

st :: cout << „silnia” << na jednego << ' = ' << silnia ( na jednego ) << st :: koniec ;

}

Podany przykład kodu demonstruje użycie constexpr do obliczania silni liczby w sposób rekurencyjny. W tym przykładzie kompilator może obliczyć wyrażenie silni w czasie kompilacji, ponieważ funkcja silni jest zadeklarowana i zdefiniowana za pomocą specyfikatora constexpr. Używając constexpr w programie C++, kompilator ocenia wyrażenie silni 5 w czasie kompilacji, eliminując potrzebę obliczeń w czasie wykonywania.



Przyjrzyjmy się teraz szczegółowemu podziałowi kodu z konkretnymi szczegółami i objaśnieniami.



Najpierw używamy #include , aby włączyć plik nagłówkowy „iostream”, który zapewnia podstawowe funkcje wejściowe i wyjściowe, takie jak „std::cout” do drukowania na konsoli.





Następnie przechodzimy do funkcji silnia() (rekurencyjnej), która ma postać „constexpr int silnia(int n)”. Ta funkcja silnia() definiuje funkcję rekurencyjną, która oblicza silnię liczby całkowitej „n”. Constexpr oznacza, że ​​optymalizacja wydajności może wynikać z oceny funkcji podczas kompilacji.

Powrót n <= 1? Linia 1 : (n * silnia(n – 1)) wykorzystuje wyrażenie warunkowe dla rekurencji, które stwierdza, że ​​jeśli „n” jest mniejsze lub równe 1, zwraca 1 (przypadek podstawowy). Jeśli nie, wykonuje obliczenia silni (n! = n * (n-1)!), co jest ogólnym wzorem na obliczenie silni, poprzez wielokrotne wywoływanie siebie przez „n – 1”, a następnie mnożenie wyniku przez „n ”. Linie te pełnią rolę strażnika w obliczeniach silni. Sprawdza, czy liczba jest na poziomie podstawowym i zwraca 1, jeśli tak. Jeśli nie, rozpoczyna się reakcja łańcuchowa wywołań funkcji, z których każde działa na mniejszych liczbach, aż do osiągnięcia przypadku podstawowego. Następnie wyniki mnoży się w odwrotnej kolejności. Poniżej znajduje się wynik kodu w celach informacyjnych:



Przykład 2: Liczenie małych liter przedstawiające ciąg C++ Constexpr

Tutaj dowiemy się, jak policzyć małe litery za pomocą ciągu znaków Countexpr. W tym przykładzie celem jest policzenie małych liter w danym ciągu przy użyciu funkcji constexpr w celu skrócenia czasu wykonywania obliczeń. Funkcja countLowercase(), zadeklarowana jako constexpr, przyjmuje jako parametr ciąg znaków „string_view” i jako dane wejściowe iteruje po każdym znaku danego ciągu. Dla każdej napotkanej małej litery liczba jest zwiększana. Wynik jest następnie uzyskiwany w czasie kompilacji, gdy funkcja działa na wyrażeniach stałych, pokazując korzyści w zakresie wydajności i wydajności oceny w czasie kompilacji. Najpierw sprawdź poniższy kod. Następnie przejdź do szczegółowego wyjaśnienia:

#include
#include
używając przestrzeni nazw std ;
constexpr rozmiar_t liczbaMałe litery ( string_view s ) {
rozmiar_t liczyć = 0 ;
Do ( zwęglać C : S ) {
Jeśli ( jestniższy ( C ) ) {
liczyć ++;
}
}
powrót liczyć ;
}
wew główny ( ) {
cout << „Wszystkie małe litery w „ Małe litery ' są ='
<< liczbaMałe litery ( 'Małe litery' ) << koniec ;
}

Oto szczegółowy podział kodu z objaśnieniem każdej linii:

Dołączono #include , aby używać standardowej biblioteki strumieni wejścia/wyjścia do drukowania komunikatów. #include zawiera klasę „string_view”, która umożliwia wydajną manipulację ciągami znaków.

W funkcji countLowercase() funkcja „constexpr size_t countlower(string_view s)” zlicza małe litery w danym widoku ciągu. Int main() to punkt wejścia programu, który wypisuje komunikat wskazujący liczbę małych liter w „LoWeR Case LeTtErS” i wywołuje funkcję countLowercase() z „LoWeR Case LeTtErS” jako danymi wejściowymi i drukuje wynik. Zapoznaj się z następującymi wynikami programu:

Przykład 3: Demonstracja tablicy przy użyciu Constexpr

Demonstracja tablic pokazuje, w jaki sposób tablice będące ustrukturyzowanymi zbiorami elementów tego samego typu danych są tworzone, dostępne i manipulowane w języku programowania. Poniżej wyjaśnimy to na przykładzie kodu, w którym program zapewnia prosty przykład inicjalizacji i manipulacji tablicą w czasie kompilacji.

Demonstracja tablic ilustruje koncepcję tablic — uporządkowanego zbioru elementów, które mają ten sam typ danych — oraz sposób, w jaki można je tworzyć, uzyskiwać do nich dostęp i manipulować nimi za pomocą języka programowania. W poniższym przykładzie kodu zademonstrujemy, jak zainicjować tablicę w czasie kompilacji, obliczyć jej rozmiar i wydrukować elementy danej tablicy. Zobacz poniższy podany kod i przejdź do wyjaśnienia:

#include
używając przestrzeni nazw std ;
wew główny ( ) {
constexpr wew tablica [ 9 ] = { 5 , 55 , 555 , 5555 , 55555 } ;
constexpr wew tablica_rozmiaru = rozmiar tablica / rozmiar ( wew ) ;
cout << „Długość tablicy wynosi =” << tablica_rozmiaru << koniec ;
cout << „Elementy tablicy to =' ;
Do ( wew I = 0 ; I < tablica_rozmiaru ; ++ I ) {
cout << tablica [ I ] << '' ;
}
}

Ten program inicjuje tablicę constexpr, oblicza jej długość w czasie kompilacji, a następnie wypisuje długość tablicy i jej elementy na konsoli. Constexpr zapewnia, że ​​tablica i jej właściwości są określane w czasie kompilacji. Złammy kod i wyjaśnijmy po kolei poszczególne szczegóły:

Aby uwzględnić standardową bibliotekę strumieni wejścia-wyjścia, umożliwiającą użycie funkcji takich jak „cout” na wyjściu, wywoływana jest #include . Program rozpoczyna wykonywanie od funkcji int main(). W funkcji main() zdefiniowana jest tablica „arrayint[]” o rozmiarze 9 z instrukcją constexpr int arrayint[9]. Tablica jest inicjowana pięcioma liczbami, a pozostałe elementy domyślnie pozostają równe 0. int długość_a = sizeof arrayint / sizeof(int); oblicza rozmiar „tablicy” w bajtach.

Pętla „for” iteruje po elementach tablicy „arrayint[]”, a następnie wartości są drukowane na konsoli. Zobaczmy następujący wynik podanego kodu:

Wniosek

Wprowadzenie i ewolucja słowa kluczowego constexpr w C++ zrewolucjonizowały sposób obsługi wyrażeń stałych i wartości. W tym artykule zbadano trzy praktyczne przykłady, pokazujące możliwości constexpr w obliczaniu silni, liczeniu małych liter i inicjowaniu tablic w czasie kompilacji. Najważniejsze wnioski obejmują zwiększoną wydajność, skrócony czas wykonywania obliczeń i lepszą wydajność pamięci. Constexpr jest cennym narzędziem do tworzenia niezawodnych, stałych jednostek w bazie kodu, zapewniającym niezmienność i przyczyniającym się do bardziej usprawnionych i wydajnych programów.