2017-02-20 16 views
5

В дополнении к std::is_trivial и std::is_trivially_copyable, C++ 11 предоставляет целый ряд признаков типа для проверки того типа имеет тривиальные конструктор, деструкторы и копирование/операторы присваивания перемещения, то есть:Обоснования признаков типа проверке тривиальности класса специальных функций

  • 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

Что является их оригинальная намеченная цель? Разумеется, некоторые документы (документы) комитета C++ должны объяснить обоснование их включения в стандартную библиотеку C++.

+0

Они отлично подходят для модульного тестирования, чтобы убедиться, что кто-то испортил и сделал что-то, что ДОЛЖНО быть тривиально, что бы ни было тривиально, что приводит к молчаливому вызову неопределенного поведения в производственном коде. Также создавайте приятные 'static_assert' ловушки времени компиляции в производственном коде, если кто-то действительно * глупый, а не модульный. – user4581301

ответ

2

Почему они находятся в стандартной библиотеке? Потому что они полезны, но невозможно реализовать на языке.


Два конкретных примера полезности.

  • std::is_trivially_copy_constructible - Если у меня есть vector типа, который является тривиальным скопировать конструктивны, не нужно индивидуально скопировать каждый элемент, когда я делаю перераспределению. Я могу memcpy() весь блок за один раз. Нам нужна черта этого типа, чтобы проверить, безопасна ли эта оптимизация.
  • std::is_trivially_destructible - Trivial destruction - важное качество. Это один из критериев, чтобы он был буквальным типом и, следовательно, использовался в постоянном выражении. Бывают ситуации, когда я хочу, чтобы мой тип мог использоваться как литерал, где это возможно (например, std::optional). Нам нужен этот тип, чтобы сделать optional<T> условно тривиально разрушаемым.
+4

«Если у меня есть вектор типа, который тривиально копирует конструкцию, мне не нужно индивидуально копировать каждый элемент, когда я перераспределяю». Это требует тривиально скопируемого. –

+1

Я прочитал, что memcpy может быть намного менее эффективным, чем использование тривиального конструктора копии, потому что компилятор генерирует инструкции, которые копируют весь большой блок памяти, а memcpy копирует байты по байтам ... Поэтому хорошая новость - это просто не заботиться о это свойство типов, (современный) компилятор будет работать лучше, если вы его не используете. – Oliv

+0

@Oliv Почему, по вашему мнению, компилятор может генерировать эффективный код для копирования кучи объектов, но не пучок байтов? – Barry

 Смежные вопросы

  • Нет связанных вопросов^_^