Встроенное объявление структуры - PullRequest
7 голосов
/ 11 октября 2011

Мне было интересно отметить, что C ++ (в частности VSVC ++ 2008) позволяет мне объявлять struct inline в методе. например:

MyClass::method()
{
 struct test{ int x;};
 test t = {99};
}

У меня вопрос: как эта декларация работает внутри, и, в частности, имеет ли она какие-либо негативные последствия для производительности?

Ответы [ 3 ]

6 голосов
/ 11 октября 2011

как это объявление внутренне работает?

Точно так же, как объявление в области имен, за исключением того, что имя видно только в пределах блока, в котором оно объявлено (в данном случае, функция тела).ОБНОВЛЕНИЕ: как указывает @Nawaz, есть одно или два дополнительных ограничения, которые применяются к локальным классам: они не могут иметь статические члены-данные и (в C ++ 03, но не в C ++ 11) их нельзя использовать какаргументы типа шаблона.

имеет ли это какие-либо негативные последствия для производительности?

Нет, кроме его области действия (которая влияет только на то, компилируется ли код),идентичен любому другому определению класса.

2 голосов
/ 11 октября 2011

Основным отличием от определения типа внутри области действия функции или за ее пределами является, ну, в общем, область действия. То есть, если он определен внутри функции, он не будет доступен вне функции.

Хотя есть и другие различия (по крайней мере, в C ++ 03, я не перепроверил C ++ 11), вы не можете иметь статический член или член шаблона в локальном классе. Вы не можете использовать этот локальный класс в качестве аргумента для шаблона (это ограничение было удалено в C ++ 11), и IIRC это потому, что локальный класс имеет внутреннюю связь (а не внешнюю для класса уровня пространства имен) и требуются шаблоны аргументы для внешней связи.

0 голосов
/ 11 октября 2011

Если вы думаете, что объявление struct в функции приводит к отрицательной стоимости после каждого вызова и занимает время процессора, вы ошибаетесь.Компилятор обрабатывает его во время компиляции, и это так же, как вы объявляете struct вне функции (но с ограниченной областью).

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