LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

А что значит?

а тело функции не видно

У тебя наверное типичный проект, где есть разделение на .h/.c файлы, и .c файлы превращаются в .o а потом линкуются в .exe.

Так вот, когда компилятор компилирует A.c, где есть вызов функции которая закодирована в B.c, то он НЕ может произвести оптимизацию функции из B.c или встроить ее вместо вызова. Потому что весь код что он видит, это A.c и заголовочные файлы.

То есть B.c он не видит, и тела функций в B.c он тоже не видит.

Именно поэтому нужно определять inline функции не в B.c если их нужно вызвать из A.c, а нужно определять их именно в B.h где компилятор их сможет увидеть, если этот заголовочный файл будет подключен к А.c

MOPKOBKA: Если они передаются по указателю, а тело функции не видно, то не пакует

Теперь когда понятно что значит видит/не видит, можно посмотреть на ситуацию, когда компилятор видит тело функции, пусть функция и использует указатели: https://godbolt.org/z/Phjv9aYKx

За счет того что компилятор увидел тело твоей функции с указателями, он может ее оптимизировать в нормальную.

Для того что бы компилятор видел все .c файлы, можно использовать LTO либо их все вместе компилировать. Но это не так уж и важно на самом деле, думаю в твоем проекте сейчас важнее что то написать, а улучшать можно когда все будет работать.

Исходная версия MOPKOBKA, :

А что значит?

а тело функции не видно

У тебя наверное типичный проект, где есть разделение на .h/.c файлы, и .c файлы превращаются в .o а потом линкуются в .exe.

Так вот, когда компилятор компилирует A.c, где есть вызов функции которая закодирована в B.c, то он НЕ может произвести оптимизацию функции из B.c или встроить ее вместо вызова. Потому что весь код что он видит, это A.c и заголовочные файлы.

То есть B.c он не видит, и тела функций в B.c он тоже не видит.

Именно поэтому нужно определять inline функции не в B.c если их нужно вызвать из A.c, а нужно определять их именно в B.h где компилятор их сможет увидеть, если этот заголовочный файл будет подключен к А.c

MOPKOBKA: Если они передаются по указателю, а тело функции не видно, то не пакует

Теперь когда понятно что значит видит/не видит, можно посмотреть на ситуацию, когда компилятор видит тело функции, пусть функция и использует указатели: https://godbolt.org/z/Phjv9aYKx