Статическое ключевое слово в параметре функции

Я только что нашел это функциональное определение в некотором встроенном коде:

float round_float_to_4(static float inputval);

Я знаком с другим использованием для статического (глобальные переменные, функции и локальные переменные), но это - первый раз, когда я рассматриваю его как спецификатор для параметра функции. Я предполагаю, что это вынуждает компилятор использовать местоположение постоянной памяти для inputval вместо стека?

16
задан Josip 15 February 2010 в 10:20
поделиться

3 ответа

Это нестандартно. Я бы предположил то же самое, что и вы, и меня не удивляет такое расширение в компиляторах, имеющих встроенную цель.

11
ответ дан 30 November 2019 в 22:24
поделиться

Это неверно. Единственное допустимое место, где static может использоваться в параметре функции, о котором я знаю, - это измерение массива

float round_float_to_4(float inputval[static 4]);

. Говоря, что inputval будет во всех вызовах этой функции, указывает на память, обеспечивающую не менее 4 чисел с плавающей запятой (это добавление C99, его нет в C89).

5
ответ дан 30 November 2019 в 22:24
поделиться

Для решения этой проблемы можно использовать boost:: shared _ ptr . В конструкторе можно передать пользовательскую функцию подчистки, которая может быть startObject-Method библиотеки, создавшей указатель. Пример:

boost::shared_ptr< MyObject > Instance( getObject( ), deleteObject );

Если для DLL не требуется C-интерфейс, то getObject может возвращать shared_ptr.

-121--2145723-

Приложение Template Method образцов имеет две основные характеристики:

  1. Существует базовый класс (в Java один только с защищенными конструкторами и опционально объявленный как абстрактный ), который будет классифицирован в коде клиента.
  2. В базовом классе определены две группы методов : а) один или несколько шаблонных методов (обычно только один) и один или несколько примитивных методов операций (обычно более одного). Каждый шаблонный метод представляет операцию высокого уровня, реализованную в самом базовом классе в терминах примитивных операций, которые предназначены для реализации/переопределения в каждом конкретном подклассе. Как правило, метод шаблона является открытым и не может быть переопределен ( final , в Java); его документация API должна точно указывать, какие примитивные методы работы она вызывает, и когда (то есть должна описывать «алгоритм»). Примитивный метод работы, представляющий собой шаг в алгоритме, должен быть непубличным, но переопределяемым ( protected , в Java), и может быть двух типов: а) абстрактный метод, который должен быть реализован в подклассе; b) метод с реализацией по умолчанию/пустой реализацией, которая может быть переопределена в подклассе.

Хорошим примером в Java 6 SDK является метод execute () класса javax.swing.SwingWorker (это метод public final void ). В этом случае примитивными методами работы являются doInBackground () , process (List) и done () . Первый является абстрактным и поэтому требует реализации в подклассе; вызывается методом шаблона в фоновом потоке. Две другие имеют пустые реализации и могут быть необязательно переопределены в подклассе; они вызываются во время и в конце обработки, соответственно, в EDT (Swing Event Dispatch Thread), чтобы разрешить обновления пользовательского интерфейса.

По своему опыту я иногда использовал этот образец. Одним из таких случаев был базовый класс Java, реализующий интерфейс java.util.Iterator , где next () был шаблонным методом, и существовал только один примитивный метод операции, ответственный за создание экземпляра определенного класса доменных объектов (это предполагалось использовать при итерации по списку постоянных объектов доменных объектов с помощью JDBC). Лучшим примером в том же приложении был базовый класс, где метод шаблона реализовывал много-пошаговый алгоритм, предназначенный для заполнения «экрана обслуживания бизнес-объекта» (с использованием Swing) из заданного списка постоянных объектов; методы примитивных операций вызывались для 1) очистки текущего состояния экрана и 2) добавления объекта в табличное представление внутри экрана; при необходимости из метода шаблона вызывались другие примитивные операции, если экран был доступен для редактирования.

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

-121--3545829-

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

Меньшие чипсы не имеют возможности поместить переменные в стек, поэтому все параметры неявно являются ячейками памяти.

1
ответ дан 30 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

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