Я читаю этот вопрос о inline в часто задаваемых вопросах isocpp, код указан как
void f()
{
int x = /*...*/;
int y = /*...*/;
int z = /*...*/;
// ...code that uses x, y and z...
g(x, y, z);
// ...more code that uses x, y and z...
}
то он говорит, что
Предполагая типичную реализацию на С++, которая имеет регистры и стек, регистры и параметры записываются в стек непосредственно перед вызов
g(), тогда параметры считываются из стека внутриg()и снова прочитайте, чтобы восстановить регистры, покаg()возвращается вf(). Но это много ненужного чтения и письма, особенно в случаях, когда компилятор может использовать регистры для переменныхx,yиz: каждая переменная может быть записана дважды (как регистр и также как параметр) и дважды читайте (при использовании вg()и восстановите регистры во время возврата кf()).
Мне трудно понять абзац выше. Я пытаюсь перечислить свои вопросы, как показано ниже:
- Для того, чтобы компьютер мог выполнять некоторые операции над некоторыми данными, которые находятся в основной памяти, верно ли, что данные должны сначала загружаться в некоторые регистры, а затем ЦП может работать с данными? (Я знаю, что этот вопрос не имеет особого отношения к С++, но понимание этого будет полезно для понимания того, как работает С++.)
- Я думаю, что
f()- это функция, аналогичная функцииg(x, y, z). Почемуx, y, zперед вызовомg()находятся в регистрах, а параметры, переданные вg(), находятся в стеке? - Как известно, что объявления для
x, y, zделают их сохраненными в регистрах? Где хранятся данные внутриg(), регистрируются или стекаются?
PS
Очень сложно выбрать приемлемый ответ, когда ответы все очень хорошие (например, те, что предоставлены @MatsPeterson, @TheodorosChatzigiannakis и @superultranova). Я думаю. Лично мне нравится @Potatoswatter немного больше, так как ответ предлагает некоторые рекомендации.