До сегодняшнего дня я всегда думал, что достойные компиляторы автоматически преобразуют struct pass-by-value в pass-by-reference, если структура достаточно велика, чтобы последняя была быстрее. Насколько мне известно, это похоже на беспроблемную оптимизацию. Однако, чтобы удовлетворить мое любопытство относительно того, действительно ли это происходит, я создал простой тестовый пример как на С++, так и на D и посмотрел вывод как GCC, так и Digital Mars D. Оба настаивали на передаче 32-байтных структур по значению, когда вся эта функция была связана с добавлением членов и возвратом значений без изменения структуры, переданной в. Версия С++ приведена ниже.
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
Мой вопрос в том, почему heck не хотел бы, чтобы это было оптимизировано компилятором для передачи по ссылке вместо фактического нажатия всех этих int
в стек?
Примечание. Используются переключатели компилятора: GCC -O2 (-O3 inlined foo().), DMD -O -inline -release.
Edit: Очевидно, что в общем случае семантика pass-by-value vs. pass-by-reference не будет одинаковой, например, если задействованы конструкторы копирования или исходная структура изменяется в вызываемом. Однако во многих сценариях реального мира семантика будет идентичной с точки зрения наблюдаемого поведения. Это те случаи, о которых я прошу.