Доступ к члену через указатель на объект

В стеке компилятор может выполнять множество оптимизаций, поскольку контекст статичен и известен во время компиляции, но при работе с доступом к динамически размещенным объектам и, как правило, с доступом «по ссылке», контекст неизвестен, поэтому логически В таких случаях доступ к элементу сводится к разыменованию адреса памяти, полученного путем добавления базового адреса объекта и смещения для этого элемента. Или это? Я довольно новичок в этом, поэтому на данный момент я только догадываюсь и, возможно, упускаю много деталей.

Например, я заметил, что если я реализую + оператор как void add(int * a, int * b, int * r); при работе с элементами стека (и с использованием & оператор) код сборки идентичен тому, что обычный + оператор создает, поэтому кажется, что указатели, которые, как известно, указывают на компиляцию известных значений времени, оптимизируются для исключения дополнительной разыменования (и копирования) и косвенных указателей внутри add() Функция указана как прямой доступ к объектам стека. Означает ли это, что компилятор «достаточно хорош», чтобы иметь возможность оптимизировать, скажем, средства доступа, реализованные с косвенным изменением от смещений постоянных значений от базового адреса объекта в стеке, как если бы он использовал доступ к элементу структуры для получения этого значения?

0

Решение

Я не знаю, как вы реализовали тело функции, поэтому этот ответ может быть полностью отключен :).

Если вы добавляете внутри своей функции r = a + b, код будет выглядеть так же, но не будет таким же.

для прототипа (int *, int *, int *) вы добавите указатели, что неправильно.
Чтобы получить целочисленное значение внутри вашей функции, тело должно быть:

*r = *a + *b ;

ИЛИ ЖЕ

r[0] = a[0] + b[0];

для того, чтобы получить значение, которое вы хотите.
Это тело не должно иметь тот же код сборки, что и оператор +, поскольку указанные значения не известны во время компиляции.

за прототип &Int & Int &) и тело

r = a + b;

компилятор встроит эту функцию, так что да, сборка должна быть идентична.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]