В стеке компилятор может выполнять множество оптимизаций, поскольку контекст статичен и известен во время компиляции, но при работе с доступом к динамически размещенным объектам и, как правило, с доступом «по ссылке», контекст неизвестен, поэтому логически В таких случаях доступ к элементу сводится к разыменованию адреса памяти, полученного путем добавления базового адреса объекта и смещения для этого элемента. Или это? Я довольно новичок в этом, поэтому на данный момент я только догадываюсь и, возможно, упускаю много деталей.
Например, я заметил, что если я реализую +
оператор как void add(int * a, int * b, int * r);
при работе с элементами стека (и с использованием &
оператор) код сборки идентичен тому, что обычный +
оператор создает, поэтому кажется, что указатели, которые, как известно, указывают на компиляцию известных значений времени, оптимизируются для исключения дополнительной разыменования (и копирования) и косвенных указателей внутри add()
Функция указана как прямой доступ к объектам стека. Означает ли это, что компилятор «достаточно хорош», чтобы иметь возможность оптимизировать, скажем, средства доступа, реализованные с косвенным изменением от смещений постоянных значений от базового адреса объекта в стеке, как если бы он использовал доступ к элементу структуры для получения этого значения?
Я не знаю, как вы реализовали тело функции, поэтому этот ответ может быть полностью отключен :).
Если вы добавляете внутри своей функции r = a + b, код будет выглядеть так же, но не будет таким же.
для прототипа (int *, int *, int *) вы добавите указатели, что неправильно.
Чтобы получить целочисленное значение внутри вашей функции, тело должно быть:
*r = *a + *b ;
ИЛИ ЖЕ
r[0] = a[0] + b[0];
для того, чтобы получить значение, которое вы хотите.
Это тело не должно иметь тот же код сборки, что и оператор +, поскольку указанные значения не известны во время компиляции.
за прототип &Int & Int &) и тело
r = a + b;
компилятор встроит эту функцию, так что да, сборка должна быть идентична.
Других решений пока нет …