2017-02-20 9 views
5

Oprócz std::is_trivial i std::is_trivially_copyable, C++ 11 przewiduje szereg cech typu sprawdzania, czy typy mają trywialne konstruktorów, destruktory i operatory przypisania Kopiuj/Przenieś, tjUzasadnienie typu cech sprawdzanie trywialności klasy funkcji specjalnych

  • std::is_trivially_constructible
  • std::is_trivially_default_constructible
  • std::is_trivially_copy_constructible
  • std::is_trivially_move_constructible
  • std::is_trivially_assignable
  • std::is_trivially_copy_assignable
  • std::is_trivially_move_assignable
  • std::is_trivially_destructible

Jaki jest ich pierwotnym celem zamierzonym? Z pewnością niektóre dokumenty komisji C++ muszą wyjaśnić powody ich włączenia do standardowej biblioteki C++.

+0

Świetnie sprawdzają się w testach jednostkowych, aby sprawdzić, czy ktoś zawiedli i zrobili coś, co MUSI być trywialne, co nie jest banalne, prowadząc do cichego wywoływania niezdefiniowanych zachowań w kodzie produkcyjnym. Stwórz także miłe pułapki 'static_assert' na czas kompilacji w kodzie produkcyjnym na wypadek, gdyby ktoś był * naprawdę * głupi, a nie testowanie jednostkowe. – user4581301

Odpowiedz

2

Dlaczego są one w standardowej bibliotece? Ponieważ są one użyteczne, ale niemożliwe do wdrożenia w języku.


Dwa konkretne przykłady użyteczności.

  • std::is_trivially_copy_constructible - Jeśli mam vector danego typu, który jest trywialnie skopiować constructible, nie trzeba indywidualnie skopiować każdy element, kiedy robię realokacji. Mogę memcpy() cały blok za jednym zamachem. Potrzebujemy tego typu cechy, aby sprawdzić, kiedy ta optymalizacja jest bezpieczna.
  • std::is_trivially_destructible - Trivial destruction to ważna cecha danego typu. Jest to jedno z kryteriów, aby był dosłowny i dlatego można go używać w ciągłej ekspresji. Są sytuacje, w których mógłbym chcieć, aby mój typ był użyteczny jako typ literalny, gdzie jest to możliwe (na przykład std::optional). Potrzebujemy tego typu cechy, aby uczynić optional<T> warunkowo trywialnie zniszczalnym.
+4

"Jeśli mam wektor typu, który jest trywialnie kopiowany, nie muszę pojedynczo kopiować każdego elementu, gdy dokonuję realokacji." To wymaga trywialnie kopiowalnej. –

+1

Przeczytałem, że memcpy może być znacznie mniej wydajne niż przy użyciu trywialnego konstruktora kopiowania, ponieważ kompilator generuje instrukcje, które kopiują cały duży blok pamięci, podczas gdy memcpy kopiuje bajt po bajtach ... Więc dobra wiadomość to po prostu nie dbać o ta własność typów, (nowoczesny) kompilator wykona lepszą robotę, jeśli jej nie użyjesz. – Oliv

+0

@Oliv Dlaczego myślisz, że kompilator może wygenerować wydajny kod do kopiowania pęczków obiektów, ale nie garść bajtów? – Barry

Powiązane problemy