Хотя перемещение определения из строки может помочь в некоторых случаях, это не поможет во всех случаях, например. если это не функция-член odr C++, а скорее статическая функция или вся ваша программа оптимизирована по LTO, и функция не ссылается за пределы локальной единицы перевода.
В этих случаях (и, вероятно, это тоже), вы должны отметить функцию как __attribute__((used))
, чтобы сообщить компилятору, что эта функция используется, и убедиться в этом и создать код для него в результирующем объектном файле, что также означает эта отладочная информация также будет сгенерирована.
Ваш окончательный код это будет в конечном итоге выглядит как:
#include <stdio.h>
class A {
public:
void f() __attribute__((noinline, used))
{
printf("f()\n");
}
void g() __attribute__((noinline))
{
printf("g()\n");
}
};
int main()
{
A a;
a.g();
return 0;
}
Это одна из причин, почему __attribute__((used))
был разработан. Из gcc documentation:
This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly. When applied to a member function of a C++ class template, the attribute also means that the function is instantiated if the class itself is instantiated.
Это означает, что функция будет гарантированно выделяться во всех случаях, даже если оно не используется.
(В качестве дополнительного дополнения я еще не подтвердил, что это действительно будет работать для оптимизации LTO - возможно, это должно быть, но я уверен, что это угловой случай, о котором нередко думают, я не сделал этого, пока теперь и я работаю над LTO :)
Попробуйте добавить символ где-нибудь, например, 'f;' (а не 'f();') в 'main()'. – lorro
Проверьте параметры оптимизации командной строки компилятора или параметры компилятора IDE. Практически все существующие компиляторы позволяют отключить оптимизацию. – Ari0nhh
Как быстрый хак, вы можете попробовать сделать метод 'virtual'. – pts