C ++: ctors для структур?

C ++: Поскольку структура - это класс со всем «общедоступным», создаются и вызываются -секторы по умолчанию?

Причина, по которой я прошу, - понять накладные расходы, если таковые имеются, которые C ++ может иметь по сравнению с C, когда используются структуры. Я слышал мнение, что у классов есть некоторые накладные расходы, которых нет у структур в C ++, но я сомневаюсь в этом.


person Community    schedule 30.10.2008    source источник


Ответы (4)


В C ++ нет никакой разницы, за исключением того, что по умолчанию видимость членов структуры является общедоступной, а члены класса по умолчанию - частными.

С точки зрения производительности построение структуры будет таким же быстрым, как создание класса. Фактическая скорость, конечно, будет зависеть от того, что содержит ваша структура. Если вы перемещаете структуру C на C ++, ваша структура будет содержать только типы POD (простые старые данные - без классов), у которых в любом случае нет конструкторов.

person Roddy    schedule 30.10.2008
comment
Я думал, что в отсутствие явного конструктора C ++ создал неявный конструктор, который в основном строил все члены кусочно. - person SmacL; 30.10.2008
comment
Это так, но не в том случае, если структура содержит только POD (который обычно называется тривиальным конструктором). - person Greg Rogers; 30.10.2008
comment
Будьте осторожны при использовании оператора new для создания экземпляров структур. В зависимости от вашего компилятора (например, MSVC), если ваша структура содержит типы классов, их конструкторы по умолчанию не всегда будут вызываться. Проблема в том, что компиляторы не всегда инициализируют значения так, как должны. - person kgriffs; 31.12.2008

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

Между прочим, структура - это не «класс, в котором все открыто». Это класс с public в качестве спецификатора доступа по умолчанию. Структуры могут иметь закрытые члены, но ваш рецензент кода может ударить вас, если они это сделают.

Релевантная проблема заключается не в структуре и классе, а в сравнении POD и не-POD.

Помните, как член класса "int" не инициализируется, если вы не укажете ему значение в списке инициализаторов или не установите значение в конструкторе? То же самое относится ко всем типам POD. Конструктор по умолчанию для структуры POD (или класса POD, если на то пошло) не имеет никакого отношения. Итак, хотя он номинально существует, компилятор не должен его генерировать и вызывать.

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

Итак, учитывая структуру POD:

struct sPOD {
    int foo;
    float bar;
    char baz[23];
};

Следующее, вероятно, не будет генерировать код на C ++ (кроме, возможно, перемещения указателя стека, в зависимости от того, насколько компилятор объединяет автоматические переменные вместе), как и в C:

sPOD s1;

На самом деле это не для меня в gcc.

person Steve Jessop    schedule 30.10.2008
comment
Лучший ответ. Конструктор создается всегда. Просто встроенная функция, которая ничего не делает, не генерирует большого количества кода. Пока все участники являются POD, его нет. - person Martin York; 30.10.2008

Хороший вопрос! Мое чтение Страуструпа согласуется с ответом Родди. Однако я думаю, что вызывается ctor или нет, в определенной степени зависит от того, как создается структура. Например, если вы создаете структуры с помощью malloc, я не верю, что вызывается конструктор, тогда как если вы создаете их, я думаю, что это так.

Тем не менее, я на самом деле не проверял вышеизложенное.

person SmacL    schedule 30.10.2008
comment
Я не уверен, вызывается ли конструктор для class (в отличие от структуры), когда память также не распределяется. Я думаю, что это одно из основных различий между malloc и new. - person Onorio Catenacci; 30.10.2008
comment
Вызов malloc () просто выделяет память. Это не имеет абсолютно ничего отношения к построению объекта. - person Roddy; 30.10.2008
comment
Родди прав. malloc () просто выделяет кусок памяти. Чтобы сделать его объектом, вы затем приведете (лучше reinterpret_cast) указатель на эту память к указателю нужного вам класса, и конструктор никогда не будет вызван. - person Dima; 30.10.2008
comment
Родди прав, malloc знает только, сколько байтов вам нужно. Но вместо приведения к объекту, как предлагает Дима, правильнее использовать размещение new, чтобы гарантировать, что вызываются ctors. - person jwfearn; 30.10.2008

В книге Страуструпа The C ++ Programming Language, Special Edition на странице 234, раздел 10.2.8, он приводит пример структуры с конструктором. Он также говорит немного дальше по тексту: «Конструкторы и функции доступа могут быть весьма полезны даже для таких структур ...» хотя я не верю, что он использует слово «структуры» в строгом техническом смысле. Итак, я бы предположил, что у структуры есть конструктор по умолчанию.

person Onorio Catenacci    schedule 30.10.2008