8.4 — Constexpr if instrukcje

Zwykle warunek instrukcja if jest oceniana w czasie wykonywania.

Rozważ jednak przypadek, w którym warunek jest wyrażeniem stałym, tak jak w poniższym przykładzie:

#include <iostream>

int main()
{
	constexpr double gravity{ 9.8 };

	// reminder: low-precision floating point literals of the same type can be tested for equality
	if (gravity == 9.8) // constant expression, always true
		std::cout << "Gravity is normal.\n";   // will always be executed
	else
		std::cout << "We are not on Earth.\n"; // will never be executed

	return 0;
}

Ponieważ gravity jest constexpr i inicjalizowany jest wartością 9.8, warunek gravity == 9.8 musi mieć wartość true. W rezultacie instrukcja else nigdy nie zostanie wykonana.

Ocenianie warunku constexpr w czasie wykonywania jest marnotrawstwem (ponieważ wynik nigdy się nie zmieni). Marnotrawstwem jest także kompilowanie kodu do pliku wykonywalnego, którego nigdy nie można wykonać.

Constexpr if instrukcje C++17

C++17 wprowadza constexpr if instrukcję, która wymaga, aby warunek był wyrażeniem stałym. Warunek instrukcji constexpr-if zostanie oceniony w czasie kompilacji.

Jeśli wynik instrukcji warunkowej constexpr ma wartość true, cała instrukcja if-else zostanie zastąpiona instrukcją true. Jeśli wartość warunkowa constexpr ma wartość false, cała instrukcja if-else zostanie zastąpiona instrukcją false (jeśli istnieje) lub niczym (jeśli nie ma innej).

Aby użyć instrukcji constexpr-if, dodajemy słowo kluczowe constexpr po if:

#include <iostream>

int main()
{
	constexpr double gravity{ 9.8 };

	if constexpr (gravity == 9.8) // now using constexpr if
		std::cout << "Gravity is normal.\n";
	else
		std::cout << "We are not on Earth.\n";

	return 0;
}

Gdy powyższy kod zostanie skompilowany, kompilator oceni warunek w czasie kompilacji, zobacz to tak jest zawsze true i zachowuje tylko pojedynczą instrukcję std::cout << "Gravity is normal.\n";.

Innymi słowy, skompiluje to tak:

int main()
{
	constexpr double gravity{ 9.8 };

	std::cout << "Gravity is normal.\n";

	return 0;
}

Najlepsza praktyka

Preferuj instrukcje constexpr if zamiast instrukcji non-constexpr if, gdy warunek jest wyrażeniem stałym.

Nowoczesne kompilatory i instrukcje if z warunkami warunkowymi constexpr C++17

W celach optymalizacji nowoczesne kompilatory zazwyczaj traktują wyrażenia inne niż constexpr instrukcje if, które zawierają warunki warunkowe constexpr tak, jakby były instrukcjami constexpr-if. Jednakże nie jest to wymagane.

Kompilator, który napotka instrukcję if inną niż constexpr z warunkiem constexpr, może wyświetlić ostrzeżenie zalecające użycie zamiast tego instrukcji if constexpr . Zapewni to wykonanie oceny w czasie kompilacji (nawet jeśli optymalizacje są wyłączone).

guest
Twój adres e-mail nie zostanie wyświetlony
Znalazłeś błąd? Zostaw komentarz powyżej!
Komentarze związane z poprawkami zostaną usunięte po przetworzeniu, aby pomóc zmniejszyć bałagan. Dziękujemy za pomoc w ulepszaniu witryny dla wszystkich!
Awatary z https://gravatar.com/ są połączone z podanym adresem e-mail.
Powiadamiaj mnie o odpowiedziach:  
56 Komentarze
Najnowsze
Najstarsze Najczęściej głosowane
Wbudowane opinie
Wyświetl wszystkie komentarze