Подтвердить что ты не робот

Существуют ли какие-либо "штрафы" за определение структуры внутри функции?

Просто из любопытства.

Как говорится в заголовках: существуют ли какие-либо "штрафы" за определение структуры внутри функции? (например, производительность, память, плохая практика программирования и т.д.).


P.S. Я знаю, что обычной практикой является определение (NON-шаблон) функторов внутри функций, но все же..)

4b9b3361

Ответ 1

В С++ 11 нет - нет штрафа. Я даже считаю, что это очень хороший стиль, чтобы не загрязнять какие-либо "более видимые" области с деталями реализации, если, конечно, вы не захотите повторно использовать этот функтор в другом месте. Однако lambdas являются, по существу, сжатой формой этой идеи, а обычно предпочтительнее, если вы просто используете struct как функтор. Для всех видов данных это прекрасно, хотя обычно он конкурирует с std::pair и std::tuple в этом аспекте.

В С++ 03 вы не можете использовать такую ​​структуру, как параметр шаблона, поскольку эти параметры должны иметь внешнюю привязку (Visual Studio позволяет делать это в любом случае). По-прежнему полезно использовать такую ​​структуру с полиморфным интерфейсом.

Ответ 2

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

Ответ 3

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

Ответ 4

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

Для C вы можете подойти к скрытию вещей, определив и объявив структуры в отдельном модуле и сделав их статическими. Затем вы можете предоставить функции доступа, как и для членов класса С++. Вы бы включили объявления функций в файл .h для тех модулей, которые нуждались в доступе к структурам.

Если это для С++, то создавая класс и делая структуру частной или защищенной вместе с вашей записью, соответствующие методы get/set/manipulate заботятся об остальном.

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