Я читаю этот вопрос о 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 немного больше, так как ответ предлагает некоторые рекомендации.