Действительно ли вложенные функции являются плохой вещью в gcc?

Я знаю, что вложенные функции не являются частью стандарта C, но так как они присутствуют в gcc (и то, что gcc является единственным компилятором, о котором я забочусь о), я склонен использовать их довольно часто.

Действительно ли это - плохая вещь? Если так, Вы могли показать мне некоторые противные примеры? Каково состояние вложенных функций в gcc? Будут они удалили?

21
задан Ciro Santilli 新疆改造中心法轮功六四事件 13 February 2018 в 00:14
поделиться

3 ответа

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

Небольшая история для примера - я работал в британском Политехническом институте, который в основном использовал компьютеры DEC - в частности, DEC-10 и некоторые VAXen. Все преподаватели инженерного факультета использовали в своих программах многочисленные расширения DEC для FORTRAN - они были уверены, что мы навсегда останемся магазином DEC. А потом мы заменили DEC-10 на мейнфрейм IBM, компилятор FORTRAN которого не поддерживал ни одно из расширений. Могу сказать, что в тот день было много плача и скрежета зубов. Мой собственный FORTRAN-код (симулятор 8080) перешел на IBM за пару часов (почти все время ушло на изучение того, как управлять IBM-компилятором), потому что я написал его на обычном FORTRAN-77.

17
ответ дан 29 November 2019 в 20:35
поделиться

Как вы сказали, они плохи в том смысле, что они не являются частью стандарта C и как таковые не реализуются многими (какими-либо?) Другими компиляторами C.

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

5
ответ дан 29 November 2019 в 20:35
поделиться

Иногда вложенные функции могут быть полезны, особенно с алгоритмами, которые перемешивают множество переменных. Что-то вроде записанной 4-сторонней сортировки слиянием может потребовать сохранения большого количества локальных переменных и наличия нескольких частей повторяющегося кода, которые используют многие из них. Вызов этих битов повторяющегося кода в качестве внешней вспомогательной подпрограммы потребует передачи большого количества параметров и / или доступа вспомогательной подпрограммы к ним через другой уровень косвенного обращения к указателям.

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

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

7
ответ дан 29 November 2019 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: