boost :: variant to potężny kontener do manipulowania heterogenicznym zbiorem typów. Zastanawiam się nad jego kosztami. W pamięci, myślę, że zajmuje ona rozmiar największego typu plus liczbę całkowitą reprezentującą która(). Dla apply_visitor(), myślę, że jego wydajność jest bardzo dobra, może wywołać bezpośrednio funkcję inną niż wiele ifs. Czy moje punkty są prawidłowe?Co to jest boost :: variant memory and performance cost?
Odpowiedz
Masz prawie rację.
Wielkość boost::variant
jest to maksymalny rozmiar jakichkolwiek elementu zaokrągla się w razie potrzeby do największego wyrównania plus wielkości pewnej liczby całkowitej i ponownie zaokrąglone.
Pomyśl o odmianie tych typów, przy założeniu, że znacznik jest uint32_t
:
struct foo { uint32_t value[3]; }; // size 12, align 4
struct bar { uint64_t v2; }; // size 8, align 8
nieotagowanego Unia musi mieć rozmiar 16, wyrównać 8; dodając tag 4-bajtowy musi iść do rozmiaru 24, aby zachować Wyrównaj 8.
Albo rozważyć wariant:
struct foo { uint8_t value[5]; }; // size 5, align 1
struct bar { uint16_t v2; }; // size 2, align 2
nieotagowanego unia z nich musi mieć rozmiar 6, wyrównać 2; dodanie 4-bajtowego tagu zmusza cię do rozmiaru 12, wyrównanie 4.
W przypadku wywoływania, oczekuję, że użyje wyszukiwania tablic funkcji (w ten sposób zaimplementowałem własny wariant, który był konieczny, ponieważ boosty nie konstruktory ruchu wsparcia), ponieważ jeśli łańcuchy nie działają dobrze, a przełączniki są niemożliwe.
- 1. In-memory LINQ performance
- 2. Django Performance/Memory usage
- 3. boost :: variant recursive trouble
- 4. List and Linq To Sql Performance Issue
- 5. boost :: variant konwersja do typu
- 6. Performance boost Python
- 7. Lisp, cffi, let and memory
- 8. boost :: variant - dlaczego "const char *" jest konwertowane na "bool"?
- 9. Jaki jest odpowiednik opcji boost :: variant w bibliotece standardowej C++?
- 10. Qt and Boost RPC
- 11. CMake and Boost
- 12. Objective C Structs and Memory Management
- 13. co to jest BOOST_ROOT?
- 14. Wywoływanie metody wspólne dla typów w boost :: variant
- 15. co to jest .netrwhist?
- 16. Co to jest Serializable? Co to znaczy?
- 17. Co to jest __FILE__?
- 18. ElasticSearch and highlighting performance - podświetlacz wektorów prostych i szybkich
- 19. C++ Boost: co jest przyczyną tego ostrzeżenia?
- 20. GenericRepository and EF. Czy to jest dobre?
- 21. Co to jest "usuń to"?
- 22. Co to jest pozostały czas na głównym wykresie kołowym Eclipse Memory Analyzer?
- 23. Co to jest Angular 2 RC kątowy2-in-memory-web-api?
- 24. CSS: #id .class VS .class performance. Co jest lepsze?
- 25. Co to jest Pagel?
- 26. Co to jest _GLOBAL_OFFSET_TABLE?
- 27. Co to jest "android.R.layout.simple_list_item_1"?
- 28. Co to jest DetailsView.EnableModelValidation?
- 29. Co to jest NSPathStore2?
- 30. Co to jest czasownik = "*"?
Zwiększenie jest źródłem otwartym. Możesz zrobić trochę badań i przeglądać kod źródłowy. Wygląda na to, że już wiesz, czego szukać. – Drop
'apply_visitor' robi" wiele ifs "pod maską (w rzeczywistości jest bardziej jak (duży, metaprogramowany) przełącznik tego rodzaju (' który() ') wariantu Oczywiście jest to po prostu minimalna wymagana praca.) – sehe