2008-10-30 3 views
4

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

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

ответ

15

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

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

+0

Я думал, что в отсутствие явного конструктора C++ создал неявный, который в принципе строил все члены кусочно. – 2008-10-30 12:54:39

+0

Это так, но если структура содержит только POD (который обычно называется тривиальным конструктором). – 2008-10-30 13:29:03

+0

Будьте осторожны при использовании оператора «new» для создания экземпляров структур. В зависимости от вашего компилятора (например, MSVC), если ваша структура содержит типы классов, их конструкторы по умолчанию не всегда будут вызываться. Проблема в том, что компиляторы не всегда инициализируются как инициализация. – kgriffs 2008-12-31 16:37:27

1

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

Это, я действительно не проверял выше.

1

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

13

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

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

Соответствующая проблема не является структурой по сравнению с классом, это POD vs. non-POD.

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

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

Таким образом, учитывая POD-структуру:

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

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

sPOD s1; 

Действительно, это не для меня на gcc.