Я пытаюсь понять, как ключевое слово inline работает с указателями на переменные.

Рассмотрим следующий пример:

struct S
{
 float a;
 float b;
};

inline void foo (struct S *s)
{
   s->a = 5;
}

void main()
{
 struct S ss;
 foo(&ss);
}

Когда компилятор встраивает функцию foo, будет ли он генерировать

void main()
{
 struct S ss;
 (&ss)->a = 5;
}

Или он будет генерировать

void main()
{
 struct S ss;
 ss.a = 5;
}

Другими словами, потребуется ли коду отменить ссылку на указатель на структуру или он поймет, что его нужно заменить только структурой?

Во встроенном приложении это могло бы существенно повлиять на время выполнения.

0
PanchoPaz 31 Окт 2018 в 04:41

1 ответ

Лучший ответ

Компилятор требуется только для генерации кода, который достигает результата, требуемого семантикой языка. То, как конкретный компилятор достигает этого, полностью зависит от реализации. Возможно даже, что код вообще не будет встроен.

Чтобы определить, как ваш конкретный компилятор будет транслировать этот код, вы можете либо дать ему указание вывести список сборки сгенерированного кода, либо проверить дизассемблирование кода в отладчике. Сгенерированный код также может сильно отличаться в зависимости от параметров компилятора, таких как уровень оптимизации.

0
Clifford 31 Окт 2018 в 08:03