Как я понимаю, некоторые парни, которые пишут компиляторы, как только вы вызываете функцию изнутри, вряд ли ваш код будет встроен в любом случае. Но именно поэтому вы не должны использовать макрос. Макросы удаляют информацию и оставляют компилятору гораздо меньше возможностей для оптимизации. Благодаря многопроходным компиляторам и оптимизации всей программы они будут знать, что встраивание вашего кода приведет к неудачному предсказанию ветвления, пропаданию кэша или другой черной магии, заставляющей современные процессоры работать быстро. Я думаю, что все правы, указывая на то, что приведенный выше код в любом случае не оптимален, так что именно на этом и следует сосредоточиться.
алПереполнение стека о плюсах / минусах функционально-подобных макросов против встроенных функций.
Я нашел следующее обсуждение:Плюсы и минусы различных макрофункций / встроенные методы в C
... но это не ответило на мой основной вопрос.
А именно, каковы издержки в использовании макрос-функции (с переменными, возможно, вызовами других функций) против встроенной функции с точки зрения использования памяти и скорости выполнения?
Существуют ли какие-либо различия в издержках, зависящие от компилятора? В моем распоряжении есть как icc, так и gcc.
Мой фрагмент кода, который я модулирую:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = AttractiveTerm * AttractiveTerm;
EnergyContribution +=
4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
Моя причина для превращения его во встроенную функцию / макрос заключается в том, что я могу поместить его в файл c, а затем условно скомпилировать другие похожие, но немного отличающиеся функции / макросы.
например.:
double AttractiveTerm = pow(SigmaSquared/RadialDistanceSquared,3);
double RepulsiveTerm = pow(SigmaSquared/RadialDistanceSquared,9);
EnergyContribution +=
4 * Epsilon * (RepulsiveTerm - AttractiveTerm);
(обратите внимание на разницу во второй строке ...)
Эта функция является центральной в моем коде и вызывается тысячи раз за шаг в моей программе, а моя программа выполняет миллионы шагов. Таким образом, я хочу, чтобы издержки LEAST были возможными, поэтому я трачу время на беспокойство по поводу затрат на встраивание v. Преобразования кода в макрос.
Основываясь на предыдущем обсуждении, я уже осознал другие плюсы и минусы (независимость типов и возникающие в результате ошибки) макросов ... но больше всего я хочу знать, и пока не знаю, это ЭФФЕКТИВНОСТЬ.
Я знаю, что некоторые из вас, ветераны С, будут иметь отличное понимание для меня !!