Если я использую встроенные функции, увеличивается ли использование памяти?C Встроенные функции и использование памяти
ответ
Зависит от функции. Простые однострочные устройства могут иметь уменьшение памяти, так как не нужно устанавливать и очищать столбец, и вызов функции не выполняется. Если функция больше, чем это накладные расходы, необходимые для вызова функции, то она, конечно же, раздувает код.
Встроенные функции определенно увеличивают размер вашего окончательного исполняемого файла (или двоичного), потому что они будут «скопированы», если вы их называете.
Прошу прощения, но ваш ответ неполный и включен в ответы выше. – 2008-11-11 18:55:11
Ваша программа будет в общем случае увеличиваться (я уверен, что есть исключения). Потребление памяти во время работы может снизиться, но не сильно.
Почему вы спрашиваете? Обычно вы позволяете компилятору определить, должна ли быть встроена функция или нет; он обычно может сделать лучший вызов, учитывая размер и сложность функции.
Существует еще один момент, вы должны рассмотреть следующие вопросы:
Используя встроенные функции, компилятор может видеть, где переменные вызывающий абонент будет использоваться в качестве переменных в вызываемом. Компилятор может оптимизировать (часто это очень много ассемблерных строк, которые можно опустить. Обратите внимание на так называемую «проблему псевдонимов») избыточного кода на основе этих знаний. Таким образом, ваш «код раздувания» часто бывает не таким большим, особенно если у вас есть более мелкие функции, он может даже уменьшить раздувание, как сказал Джим выше.
Кто-то сделал хороший момент: лучше заставить компилятор решить, входит ли он в функцию, о которой идет речь, или нет, поскольку он знает код, который он генерирует, лучше, чем когда-либо.
Для вызова функции требуется несколько инструкций процессора.
Обычно вам требуется инструкция PUSH для каждого аргумента функции, инструкция CALL для вызова функции и часто другая команда, которая очищает стек после вызова функции.
Кроме того, функции могут изменять регистры процессора, поэтому вызывающей функции может потребоваться больше инструкций для сохранения регистров или перезагрузки значений, которые в противном случае все еще были бы в регистре.
Так что если функция, которую вы вызываете, это всего лишь несколько инструкций, то она может сэкономить память и работать быстрее.
Это говорит о том, что вложение - это когда ваш профайлер говорит вам, что вы должны.
C определяет ABI, где все параметры помещаются в стек. C++ не определяет конкретный ABI, позволяя реализациям компилятора использовать регистры для передачи параметров. Поэтому в большинстве ситуаций не все параметры будут перенесены в стек. – 2008-11-12 12:20:17
Это действительно не отвечает в общем случае.
Для начала вы обычно не имеете контроля над прокладкой. Даже если вы отметите функцию inline, она на самом деле все еще зависит от того, что компилятор увядает, он фактически сделает in-line (это всего лишь подсказка).
Компилятор сделает все возможное, чтобы оптимизировать код; использование внутрикладки - всего лишь один инструмент для этого. Таким образом, вложение коротких функций сделает код меньшим (поскольку вам не нужно настраивать параметры для вызова или извлекать возвращаемое значение. Но даже при длинных функциях ответ не является абсолютным.
Если компилятор решает inline длинная функция, тогда вы думаете, что код будет длиннее.Но это не так. поскольку это дает компилятору дополнительные возможности применять другие методы оптимизации, которые потенциально могут сделать код еще меньшим. Если анализ компиляторов обнаруживает, что полученный код набухания вреден для кода, то встраивание не будет выполнено.
В основном компилятор делает свой анализ и решает и наилучшим образом действует.
Заключение. Не беспокойтесь об этом. Компилятор умнее вас и сделает правильную вещь.
Иногда случается так, что у нас есть функции, разбросанные по всей программе. В этом случае вызов функции заставляет программу переходить на адрес функции и возвращаться при завершении вызова функции. Это отнимает драгоценное время.
Вышеупомянутая проблема может быть решена с использованием встроенных функций. Это заставляет компилятор вызывать код непосредственно из источника. Для встроенного функционального кода не создается новый набор команд памяти.
Хотя рядный заявление в C++ является свободным и происходит автоматически, когда функция определена в декларации, в с он ограничен следующими правилами ::
В C, любая функция с внутренней связью может быть объявлен встроенным, но функция с внешней связью имеет ограничения на встроенную.
Если ключевое слово inline используется в объявлении функции, тогда определение функции должно присутствовать в одной и той же единицы перевода.
встроенный тип данных function_name (аргументы)
Этот код работает до 30% fastert чем без встроенной функции, остальные в зависимости от скорости prcessor.
Теперь идет часть стратегии. Вы можете использовать встроенные функции по своему желанию, но помните, что встроенные функции могут занимать гораздо меньше времени для выполнения, но при запуске они занимают высокую память. Кроме того, компилятор всегда имеет возможность игнорировать встроенную декларацию, если код, объявленный в строке, является аномально большим по сравнению с размером кода.
Inline декларация, хотя и разрушает порядок оценки, не делает функцию внутренней. Функция по-прежнему является внешней.
Есть два вида использования памяти, встроенные функции будут влиять:
код размера — в целом, встраивание кода увеличит объем памяти, используемый для загрузки программы. Это связано с тем, что в вашей программе будет много копий сгенерированного кода. Однако это не всегда так: если ваша встроенная функция использовалась только один раз, изменений мало, и если встроенная функция очень мала, вы можете получить чистое сокращение размера кода, удалив служебные данные вызова функции. Кроме того, функция может быть уменьшена в размере оптимизатором, который может удалить код, который не используется в конкретном встроенном вызове.
использование стека — Если ваши встроенные функции имеют множество локальных переменных, вы можете использовать больше пространства стека. В C компилятор обычно выделяет пространство стека для функции один раз при входе в функцию.Это должно быть достаточно большим, чтобы удерживать все локальные переменные, которые не хранятся в регистрах. Если вы вызываете функцию вне линии, стек для этой функции используется до тех пор, пока она не вернется, когда она снова будет выпущена. Если вы встраиваете функцию, то это пространство стека останется используемым на весь срок службы uber-функции.
Вложения не будут влиять на использование кучи, поскольку такие же распределения и освобождения будут выполняться для встроенного кода, как это было бы для не-встроенной версии.
В общем случае это не отвечает. Если у вас есть конкретный пример, попробуйте и посмотрите, что произойдет. – 2008-11-11 07:16:11