Существуют ли какие-либо "штрафы" за определение структуры внутри функции?
Просто из любопытства.
Как говорится в заголовках: существуют ли какие-либо "штрафы" за определение структуры внутри функции? (например, производительность, память, плохая практика программирования и т.д.).
P.S. Я знаю, что обычной практикой является определение (NON-шаблон) функторов внутри функций, но все же..)
Ответы
Ответ 1
В С++ 11 нет - нет штрафа. Я даже считаю, что это очень хороший стиль, чтобы не загрязнять какие-либо "более видимые" области с деталями реализации, если, конечно, вы не захотите повторно использовать этот функтор в другом месте. Однако lambdas являются, по существу, сжатой формой этой идеи, а обычно предпочтительнее, если вы просто используете struct как функтор. Для всех видов данных это прекрасно, хотя обычно он конкурирует с std::pair
и std::tuple
в этом аспекте.
В С++ 03 вы не можете использовать такую структуру, как параметр шаблона, поскольку эти параметры должны иметь внешнюю привязку (Visual Studio позволяет делать это в любом случае). По-прежнему полезно использовать такую структуру с полиморфным интерфейсом.
Ответ 2
Так как это чисто проблема видимости, я не могу представить себе правдоподобный сценарий, в котором бы наблюдалось снижение производительности или памяти.
Ответ 3
Если вы используете С++ 03, тогда технически вы не можете использовать локально определенную структуру как аргумент шаблона, но некоторые компиляторы (а именно MSVC) позволяют это.
Ответ 4
Я знаю, что вы спросили о производительности, но мне было интересно узнать о другой проблеме. Вы запрашиваете как C, так и С++ или только один из этих языков? Я принимаю дикое предположение, что вы хотите определить структуру в функции для целей области или скрытия структуры.
Для C вы можете подойти к скрытию вещей, определив и объявив структуры в отдельном модуле и сделав их статическими. Затем вы можете предоставить функции доступа, как и для членов класса С++. Вы бы включили объявления функций в файл .h для тех модулей, которые нуждались в доступе к структурам.
Если это для С++, то создавая класс и делая структуру частной или защищенной вместе с вашей записью, соответствующие методы get/set/manipulate заботятся об остальном.
Если вы отредактировали свое оригинальное сообщение и расширили его, почему вы спрашиваете об этом, вы задали хороший вопрос.