Faz algum sentido usar palavras-chave inline com modelos?

Como os templates são definidos dentro dos headers e o compilador é capaz de determinar se o inlining de uma function é vantajoso, faz algum sentido? Ouvi dizer que os compiladores modernos sabem melhor quando inline uma function e estão ignorando inline dica inline .


edit: Eu gostaria de aceitar as duas respostas, mas isso não é possível. Para fechar a questão estou aceitando a resposta de phresnel , porque ela recebeu a maioria dos votos e ele está formalmente certo, mas como mencionei nos comentários considero as respostas do Puppy e do Componente 10 como corretas também, do ponto de vista diferente .

O problema está na semântica de C ++, que não é estrita no caso da palavra-chave e inline . phresnel diz “escrever em linha, se você quiser”, mas o que realmente significa inline não é claro, pois evoluiu de seu significado original para uma diretiva que “impede compiladores reclamando sobre violações de ODR”, como diz Puppy .

Não é irrelevante. E não, nem todo modelo de function é inline por padrão. O padrão é até mesmo explícito sobre isso em Especialização explícita ([temp.expl.spec])

Tem o seguinte:

a.cc

 #include "tpl.h" 

b.cc

 #include "tpl.h" 

tpl.h (extraído da especialização explícita):

 #ifndef TPL_H #define TPL_H template void f(T) {} template inline T g(T) {} template<> inline void f<>(int) {} // OK: inline template<> int g<>(int) {} // error: not inline #endif 

Compile isso, et voila:

 g++ a.cc b.cc /tmp/ccfWLeDX.o: In function `int g(int)': inlinexx2.cc:(.text+0x0): multiple definition of `int g(int)' /tmp/ccUa4K20.o:inlinexx.cc:(.text+0x0): first defined here collect2: ld returned 1 exit status 

Não declarar inline ao fazer instanciação explícita também pode levar a problemas.

Então, em resumo : Para modelos de function não totalmente especializados, ou seja, aqueles que carregam pelo menos um tipo desconhecido, você pode omitir inline e não receber erros, mas ainda assim eles não são inline . Para especializações completas, ou seja, aquelas que usam apenas tipos conhecidos, você não pode omiti-lo.

Proposta de regra de ouro : Escreva em inline se você quer dizer e seja consistente. Isso faz você pensar menos sobre se deve ou não apenas porque você pode. (Esta regra é compatível com o modelo C ++ de Vandevoorde / Josuttis : o guia completo ).

É irrelevante. Todos os modelos já estão em inline – para não mencionar que, a partir de 2012, o único uso da palavra-chave inline é parar os compiladores reclamando sobre violações de ODR. Você está absolutamente correto – seu compilador de geração atual saberá o que está embutido por conta própria e provavelmente poderá fazê-lo até mesmo entre as unidades de tradução.

Como você sugeriu, inline é uma dica para o compilador e nada mais. Pode optar por ignorá-lo ou, na verdade, por funções inline não marcadas em linha.

O uso de inlineinline com modelos costumava ser uma maneira (ruim) de contornar o problema de que cada unidade de compilation criaria um object separado para a mesma class de modelo, o que causaria problemas de duplicação no momento do link. Usando inline (eu acho) o nome mangling funciona diferente que contorna o confronto de nomes na hora do link, mas às custas do código vastamente inchado.

Marshall Cline explica aqui melhor do que eu.

    Intereting Posts