Тривиальные и нетривиальные операции в C ++ [duplicate]

Так вы можете транспонировать кортеж 2x4 в кортеж 4x2.

 >>> tuple(zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])) 
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
59
задан Prasoon Saurav 10 October 2010 в 07:14
поделиться

3 ответа

Простыми словами «тривиальная» специальная функция-член буквально означает функцию-член, которая делает свою работу очень простым способом. «Прямой способ» означает различную вещь для различных видов специальных функций-членов.

Для конструктора по умолчанию и деструктора, который является «тривиальным», означает буквально «ничего не делать». Для оператора copy-constructor и copy-assign термин «тривиальный» означает буквально «эквивалентно простому необработанному копированию памяти» (например, копирование с memcpy).

Если вы сами определяете конструктор, считается нетривиальным, даже если он ничего не делает, поэтому тривиальный конструктор должен быть неявно определен компилятором.

Чтобы специальная функция-член удовлетворяла вышеуказанным требованиям, класс должен иметь очень упрощенную структуру, он не должен содержать никаких скрытых инициализаций при создании или уничтожении объекта или каких-либо скрытых дополнительных внутренних манипуляции при копировании.

Например, если класс имеет виртуальные функции, для создания объектов этого класса потребуются дополнительные скрытые инициализации (инициализировать таблицу виртуальных методов и т. д.), поэтому конструктор для этого класса не будет считаться тривиальным.

В другом примере, если класс имеет виртуальные базовые классы, то каждый объект этого класса может содержать скрытые указатели, указывающие на другие части одного и того же объекта. Такой самореферентный объект не может быть скопирован простой процедурой копирования необработанной памяти (например, memcpy). Дополнительные манипуляции будут необходимы для правильной повторной инициализации скрытых указателей в копии. По этой причине оператор копирования и оператор присваивания копии для этого класса не будут квалифицироваться как тривиальные.

По понятным причинам это требование является рекурсивным: все подобъекты класса (базы и нестатические элементы) должны также имеют тривиальные конструкторы.

69
ответ дан AnT 22 August 2018 в 00:32
поделиться
  • 1
    Не делайте ничего ... Тогда что такое оператор присваивания копий? ;) – user 10 October 2010 в 07:17
  • 2
    Также мне разрешено иметь нетривиальный ctor like (Rect r) {l = r ....} – user 10 October 2010 в 07:20
  • 3
    @ acidzombie24: Я внес некоторые исправления для копирования функций-членов. Второй комментарий мне не ясен. Любой пользовательский конструктор является нетривиальным, поэтому, как только вы его определяете, класс больше не является POD. – AnT 10 October 2010 в 07:31
  • 4
    @ acidzombie24: Когда вы объявляете конструктор any , вы подавляете неявное объявление конструктора по умолчанию. Таким образом, у вас класс будет иметь конструктор по умолчанию no . Так оно и есть на языке pre-C ++ 0x. В C ++ 0x, AFAIK вы можете заставить компилятор генерировать конструктор по умолчанию, тем не менее, для этого потребуется явное объявление с ключевым словом default, как показано на вашей ссылке. – AnT 10 October 2010 в 17:02
  • 5
    @AndreyT: Отличное различие. – user 11 October 2010 в 03:54

Уже есть правильные ответы, но вот цитата из стандарта (которую я искал, когда я наткнулся на это сообщение):

(§12.1 / 5) Конструктор по умолчанию тривиально, если он не предоставляется пользователю и если: - его класс не имеет виртуальных функций (10.3) и не имеет виртуальных базовых классов (10.1), и - нет нестатического члена данных его класса имеет скобку или равный- initializer, и - все прямые базовые классы его класса имеют тривиальные конструкторы по умолчанию, и - для всех нестатических членов данных своего класса, которые относятся к типу класса (или его массиву), каждый такой класс имеет тривиальный конструктор по умолчанию.

Это из C ++ 11. В C ++ 03 отсутствует второй элемент и используется фраза , неявно объявленная вместо , не предоставляемая пользователем . В противном случае это идентично.

Обратите внимание, что эта спецификация охватывает только тривиальные конструкторы по умолчанию. Атрибут слова тривиальный также может использоваться в разных контекстах, например. копировать конструкторы.

21
ответ дан jogojapan 22 August 2018 в 00:32
поделиться

Конструктор класса A является тривиальным , если все верно:

  • Он неявно определен (синтезирован компилятор)
  • A не имеет виртуальных функций и виртуальных базовых классов
  • . Все прямые базовые классы A имеют тривиальные конструкторы
  • . Классы всех нестатических членов данных A имеют тривиальные конструкторы
27
ответ дан Prasoon Saurav 22 August 2018 в 00:32
поделиться
  • 1
    Извините Если это звучит глупо, но применимо ли оно к деструкторам? – Bateman 4 September 2015 в 06:27