Это вопрос для компилятора, а не для программиста.Язык требует, чтобы указатель this
был доступен в методах экземпляра.Если оптимизирующий компилятор решает, что он может выполнить требование, и все еще сохраняет все в регистрах, ему разрешается делать это согласно правилу , как если бы : внутренняя часть реализации не имеет значения, если obervable *Поведение 1005 * такое же, как если бы машина выполняла строго по стандарту (без оптимизации).
Поэтому, если вы не нацелены на конкретный компилятор с конкретными параметрами компиляции, на этот вопрос невозможно ответить.
Например, давайте посмотрим как следующий код:
#include <iostream>
#include <iomanip>
class Foo {
int val;
public:
Foo(int val = 0): val(val) {}
friend std::ostream& operator << (std::ostream& out, const Foo& f);
};
std::ostream& operator << (std::ostream& out, const Foo& f) {
out << std::hex << std::setw(2) << f.val;
return out;
}
int main() {
for (int i=0; i<10; i++) {
std::cout << Foo(i);
}
std::cout << std::endl;
return 0;
}
Компилятор может легко сделать вывод, что это программа с одним модулем компиляции: она содержит main
и не использует внешних ссылок вне стандартной библиотеки.И что он просто возобновляет:
#include <iostream>
#include <iomanip>
int main() {
for (int i=0; i<10; i++) {
std::cout << std::hex << std::setw(2) << i;
}
std::cout << std::endl;
return 0;
}
Оптимизация всего определения класса и друга operator <<
.
Очень умный компьютер может даже догадываться, что, поскольку 10
является константойexpr, все может быть разрешено во время компиляции и может генерировать тот же код, что и:
#include <iostream>
int main() {
std::cout << " 0 1 2 3 4 5 6 7 8 9\n";
return 0;
}
Я должен признать, что я не удивлюсь первой оптимизации, но я не знаю реального компилятора, который бы генерировалвторой.