Może coś podobnego już został poproszony, i pamiętaj, że to nitpick ...constexpr i inicjalizacji
mam grono stałych std::map
s do przełączania między enum (class)
wartości i ich std::string
przedstawień (obie strony). Ktoś tutaj wskazał mi, że te mapy zostaną zainicjowane w czasie wykonywania, kiedy inny kod inicjalizacyjny zostanie uruchomiony, zanim mój program wykona wszystkie dobre rzeczy. Oznaczałoby to, że wyrażenia stałe wpływają na wydajność środowiska wykonawczego, ponieważ mapy są zbudowane na podstawie par łańcuchów znaków.
Jako przykład ilustracyjnych, tutaj jest przykładem jednej z tych map:
enum class os
{
Windows,
Linux,
MacOSX
};
const map<string, os> os_map =
{ {"windows", os::Windows},
{"linux", os::Linux},
{"mac", os::MacOSX} };
const map<os, string> os_map_inverse =
{ {os::Windows, "windows"},
{os::Linux, "linux"},
{os::MacOSX, "mac"} };
Czy C++ 11 constexpr
mieć żadnego wpływu na wydajność, czy moje założenie runtime inicjalizacji kary fałszywe? Myślę, że kompilator może osadzić stały kontener STL jako czyste dane w pliku wykonywalnym, ale najwyraźniej to może nie być tak łatwe, jak ja to robię?
dlaczego nie spróbuj 'boost :: bimap' dla dwustronnego mapowania pomiędzy wyliczeniem a jego reprezentacją ciągów znaków? Znacznie mniej prawdopodobne jest popełnienie błędu podczas dodawania nowych wartości. – Xeo
Xeo: wciągnij Boost dla czegoś tak prostego jak to? Nie, dziękuję, jestem wolna od zależności i naprawdę chciałbym tak postąpić;) ... Mogę nawet zastąpić mapę ciąg-> enum z mapą 'unordered_map' i enum-> string z' vector ' '(wartości wyliczeniowe nie są ważne, po prostu liczą się jeden po drugim) dla wydajności, jeśli to poprawi cokolwiek. 'boost :: bimap' byłby przyswajalny w porównaniu :) – rubenvb
@rubenvb: A jednak [Boost.MultiIndex] (http://www.boost.org/libs/multi_index/) mógłby zrobić dokładnie to, znacznie bardziej zwięźle, z 0 nad głową. Proszę nie postrzegać Boost jako "zależności". – ildjarn