Будет ли компоновщик С++ автоматически вводить "сквозные" функции, которые НЕ определены в заголовке, а NOT явно запрошено "встраиваться" через ключевое слово inline
?
Например, следующее происходит так часто и всегда должно извлекаться из "inlining", что каждый поставщик компилятора должен "автоматически" обрабатывать его посредством "вставки" через компоновщик (в тех случаях, когда это возможно)
//FILE: MyA.hpp
class MyA
{
public:
int foo(void) const;
};
//FILE: MyB.hpp
class MyB
{
private:
MyA my_a_;
public:
int foo(void) const;
};
//FILE: MyB.cpp
// PLEASE SAY THIS FUNCTION IS "INLINED" BY THE LINKER, EVEN THOUGH
// IT WAS NOT IMPLICITLY/EXPLICITLY REQUESTED TO BE "INLINED"?
int MyB::foo(void)
{
return my_a_.foo();
}
Я знаю, что компоновщик MSVS выполнит некоторую "вставку" с помощью своего кода генерации кода времени (LTGCC) и что инструментальная цепочка GCC также поддерживает оптимизацию времени связи (LTO) (см. Может ли встроенный компоновщик работать?).
Кроме того, я знаю, что есть случаи, когда это не может быть "inlined", например, когда реализация не "доступна" для компоновщика (например, через границы разделяемой библиотеки, где происходит отдельное соединение).
Однако, если этот код связан с одним исполняемым файлом, который не пересекает границы DLL/shared-lib, я бы ожидал, что поставщик компилятора/компоновщика автоматически включит эту функцию в качестве простой и очевидной оптимизации ( пользуясь как производительностью, так и размером)?
Мои надежды слишком наивны?