Digamos que eu tenho essa pequena função em um arquivo de origem
static void foo() {}
e eu construo uma versão otimizada do meu binário, mas não quero essa função incorporada (para fins de otimização). existe uma macro que eu possa adicionar em um código fonte para impedir o inlining?
Respostas:
Você quer o
gcc
específiconoinline
atributo .Use-o assim:
fonte
O GCC tem um comutador chamado
-fno-inline-small-functions
Portanto, use isso ao invocar o gcc. Mas o efeito colateral é que todas as outras funções pequenas também não são incorporadas.
fonte
-fno-inline
não funcionam.gdb
ainda entra os métodos no step-over. Algo está quebrado, e eu duvido que estejagdb
.Uma maneira portátil de fazer isso é chamar a função através de um ponteiro:
Embora isso produza instruções diferentes para ramificação, o que pode não ser seu objetivo. O que traz um bom ponto: qual é o seu objetivo aqui?
fonte
Eu sei que a pergunta é sobre o GCC, mas achei que poderia ser útil ter algumas informações sobre outros compiladores.
O
noinline
atributo de função do GCC também é bastante popular com outros compiladores. É suportado por pelo menos:__has_attribute(noinline)
)__TI_GNU_ATTRIBUTE_SUPPORT__
)Além disso, o MSVC oferece suporte
__declspec(noinline)
ao Visual Studio 7.1. A Intel provavelmente também suporta (eles tentam ser compatíveis com o GCC e o MSVC), mas não me preocupei em verificar isso. A sintaxe é basicamente a mesma:A PGI 10.2+ (e provavelmente mais antiga) suporta um
noinline
pragma que se aplica à próxima função:A TI 6.0+ suporta um
FUNC_CANNOT_INLINE
pragma que (irritantemente) funciona de maneira diferente em C e C ++. No C ++, é semelhante ao IGP:Em C, no entanto, o nome da função é necessário:
O Cray 6.4+ (e possivelmente anterior) adota uma abordagem semelhante, exigindo o nome da função:
O Oracle Developer Studio também suporta um pragma que leva o nome da função, que remonta a pelo menos o Forte Developer 6 , mas observe que ele precisa vir após a declaração, mesmo nas versões recentes:
Dependendo de como você é dedicado, é possível criar uma macro que funcione em qualquer lugar, mas é necessário ter o nome da função e a declaração como argumentos.
Se, OTOH, você concorda com algo que simplesmente funciona para a maioria das pessoas, você pode se safar de algo que é um pouco mais esteticamente agradável e não exige repetição. Essa é a abordagem que adotei para Hedley , onde a versão atual do HEDLEY_NEVER_INLINE se parece:
Se você não quiser usar o Hedley (é um único cabeçalho de domínio público / CC0), poderá converter as macros de verificação de versão sem muito esforço, mas mais do que estou disposto a colocar ☺.
fonte
Caso você receba um erro de compilador
__attribute__((noinline))
, tente:fonte
Isto é o que funcionou para mim.
fonte
Use o
noinline
atributo :Você provavelmente deve usá-lo quando declarar a função para uso externo e ao escrever a função.
fonte
Eu trabalho com o gcc 7.2. Eu especificamente precisava de uma função para não ser incorporada, porque tinha que ser instanciada em uma biblioteca. Eu tentei a
__attribute__((noinline))
resposta, bem como aasm("")
resposta. Nenhum dos dois resolveu o problema.Por fim, imaginei que definir uma variável estática dentro da função forçaria o compilador a alocar espaço para ela no bloco de variável estática e emitir uma inicialização para ela quando a função for chamada pela primeira vez.
Isso é meio que um truque sujo, mas funciona.
fonte
inline void foo(void) { ... }
em um cabeçalho e declará-laextern inline void foo(void);
em um arquivo de origem da biblioteca. Seguindo a semântica C99, o compilador poderia incorporar a função quando agradar E emitir código de objeto na sua biblioteca. Consulte "inline" sem "estático" ou "externo" é útil no C99? .