2014-01-26 2 views
6

GCC поддерживает construtors/destructor функции, которые поддерживает выполнение функции до или после того, как основная():Когда мне нужна функция для запуска до или после main()?

Атрибут constructor вызывает функцию, которая будет вызвана автоматически до исполнения входит main(). Аналогично, атрибут destructor вызывает автоматическую вызов функции после завершения main() или вызывается exit(). Функции с этими атрибутами полезны для инициализации данных, которые используются неявно во время выполнения программы.

Вот пример от GeeksforGeeks.

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

ответ

1

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

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

+0

В чем разница, если мы просто поместим конструктор в начало main? – chux

+0

Кроме того, любая память, которую использует программа, будет освобождена при выходе. – George

1

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

Основной сценарий, в котором это минимально применимо, - это проекты с кросс-платформой, в которых вы хотели бы сохранить основную часть вашего общего кода в основном, однако на некоторых платформах, в основном встроенных, вы хотели бы дублировать то, что другие ОС перед настройкой основных переменных среды, стандартными файловыми дескрипторами (stdin/stdout/stderr) для пользовательских дескрипторов в вашей системе, назначьте свой собственный менеджер памяти - например, выделите свой собственный стек для запуска main() и т. д.

2

Такие функции конструктора и деструктора в основном полезны при написании библиотек.

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

Один из способов автоматического запуска инициализации - обозначить функцию как конструктор.

Смотрите также: How to initialize a shared library on Linux

+0

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

1

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

Общие модули не имеют конкретной процедуры инициализации (в Windows есть DllMain, но у меня есть ее ограничения).

Например, Asterisk PBX злоупотребляет конструкторами, потому что он сильно основан на модулях, он вводит конструктор на каждом модуле во время компиляции. Этот конструктор вызывается на dlload() и сообщает ядру звёздочки, правильно ли загружен модуль или нет, что позволяет ему вызывать определенные функции в модуле.

+0

На самом деле концепция применяется в равной степени к общим и статически связанным библиотекам. – harmic

Смежные вопросы