Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Zapewnienie constexpr
#1
Mam trochę problemów z tym, że niektóre z moich funkcji constexpr nie są analizowane w czasie kompilacji i zostawiają niechciany kod środowiska uruchomionego w moim pliku binarnym. Jest to porównanie między wynikiem wyjścia ICC i GCC. Jak widać, GCC nie analizuje skrótu w czasie kompilacji i nadal pozostawia ciąg w pliku binarnym. Czy jest jakiś sposób, aby zapewnić, że kod constexpr zostanie oceniony jako czas kompilacji?   Edycja: Dalsze testy pokazują, że CL 19 2017 (MSVC) nie jest w stanie ocenić podczas kompilacji, a Zapcc i Clang nie mogą się skompilować ze względu na słowo kluczowe constexpr (the fuck?).
Reply
#2
Posyp trochę inline sił i powinno działać. Jeśli nie, możesz zapełnić go typem takim jak std :: integral_constant, a następnie 100% czasu kompilacji. W tej chwili używam telefonu, ale domyślam się, że kompilatory nie są zadowolone z niepodpisanego przelewu.
Reply
#3
Testowane, MSVC ignoruje __forceinline podobnie jak GCC. Będę owijać magiczne liczby w integralną całość i zobaczyć, co stanie się jutro. Edycja: std :: integral_constant też nic nie zrobił. https://godbolt.org/g/6tebCn
Reply
#4
Zacytować: Originally Posted by ph4ge Testowane, MSVC ignoruje __forceinline podobnie jak GCC. Będę owijać magiczne liczby w integralną całość i zobaczyć, co stanie się jutro. Edycja: std :: integral_constant też nic nie zrobił. https://godbolt.org/g/6tebCn Co mam na myśli, to return std :: integral_constant :: value;
Reply
#5
Zacytować: Oryginalnie wysłana przez MagicM8 Co mam na myśli, to return std :: integral_constant :: value; Ach, tak, to miałoby więcej sensu niż to, co właśnie zrobiłem.
Reply
#6
Przy okazji masz włączone 0 optymalizacji, wykonaj "-O3" dla clang i gcc lub "/ O2" dla msvc i wszystko zniknie. Również dla clang do pracy dodaj "-std = c ++ 14"
Reply
#7
Owiń go wokół szablonu
Reply
#8
Zacytować: Oryginalnie wysłana przez MagicM8 Przy okazji masz włączone 0 optymalizacji, wykonaj "-O3" dla clang i gcc lub "/ O2" dla msvc i wszystko zniknie. Również dla clang do pracy dodaj "-std = c ++ 14" Ciekawy. Wszystkie przykłady działają tutaj, ale niektóre nadal nie są odrywane, a ciąg jest obecny w moim pliku binarnym. Jak powiedział @ kingdeking, czy coś podobnego do tej pracy?
Reply
#9
To zależy od kompilatora. O ile mi wiadomo, jedynym sposobem na pozbywanie się łańcuchów jest ich dekonstrukcja do listy inicjalizatorów lub coś podobnego do tego przy użyciu makr, aby kompilator mógł je usunąć podczas wstępnego przetwarzania. Edycja: Odbieram moje słowa - nie da się wykluczyć łańcucha z binarnie przenośnie. Może działać pod niektórymi ustawieniami kompilatora, może nie w innym dniu.
Reply
#10
constexpr powinien zostać nazwany assess_at_compile_time_or_runtime. Jedyny czas constexpr jest zapewnione do oceny w czasie kompilacji, gdy wartość jest * potrzebna * do kompilacji. Jeśli to jest możliwe do oceny wyrażenia w czasie wykonywania, należy się tego spodziewać. Niektóre sposoby zapewnienia ocena w czasie kompilacji wykorzystuje przeliczenia [1] i szablony STL / niestandardowe. Jeśli pracujesz z ciągami, wszystko staje się bardziej irytujące radzić sobie z. Jest taka implementacja, ale nie ma gwarancji, że twój ciąg nie znajdzie się w dwójkowy. W zależności od twoich potrzeb istnieją lepsze rozwiązania niż constexpr. Na przykład, jeśli próbujesz włączyć szyfrowanie ciągów, użyj pre-build i post-build events, aby uruchomić skrypt modyfikujący źródło przed kompilacją następnie przywraca ją po kompilacji. Skrypt powinien mieć konfigurację, która szyfruje wszystkie struny jednak chcesz. Następnie w kompilowanym kodzie C ++ go masz odszyfrować za pomocą równoważnej funkcji odszyfrowywania (np. wewnątrz konstruktora twojego niestandardowa klasa ciągów). [1] C ++: enum Foo {Foo1 = CompileTimeExpression}; [2] C ++: template void Foo (...) {...} ... Foo (); Przepraszamy za długą ścianę tekstu: /
Reply




Users browsing this thread: 1 Guest(s)