C ++: ctors для структур? - PullRequest
4 голосов
/ 30 октября 2008

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

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

Ответы [ 4 ]

15 голосов
/ 30 октября 2008

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

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

13 голосов
/ 30 октября 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.

1 голос
/ 30 октября 2008

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

1 голос
/ 30 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...