Области памяти не стандартизированы, хотя де-факто существуют стандарты, такие как ELF , что является общим форматом как для Unix -подобных систем, так и для встраиваемых систем.
Предполагается, что ELF -подобная система, область, где хранится исполняемый код, называется .text
. Не имеет значения, является ли функция встроенной или нет, ее машинный код окажется в этом сегменте.
Нормальная функция сохраняет свои параметры либо в регистрах, либо в стеке. Это системная спецификация c и зависит от "ABI" (двоичный интерфейс приложения). Когда такая функция становится встроенной, может не потребоваться копировать переменные из вызывающей стороны, и в этом случае они остаются в любом регистре или области, в которой они уже были размещены.
Что касается того, что произойдет в приведенном вами примере кода c функция не содержит побочных эффектов, а результаты не сохраняются, поэтому на самом деле актуален только последний круг в течение для l oop. L oop был бы выполнен 4 раза, поэтому различные операции ++ сводятся к 2 + 2 = 4.
Сгенерированный машинный код на оптимизирующем компиляторе x86 сводится к
lea eax, [rdi+4+rsi]
ret
Что в эквивалентном C коде в значительной степени означает, что ваш код был заменен следующим:
int calculation(int c , int d)
{
return c + d + 4;
}
Это потому, что сам алгоритм бессмысленен, в большей степени, чем встраивание. Компилятор вполне может встроить это без клавиатуры inline
и сделает это с включенной оптимизацией.