Como os modelos são definidos nos cabeçalhos e o compilador é capaz de determinar se uma função embutida é vantajosa, isso faz algum sentido? Ouvi dizer que os compiladores modernos sabem melhor quando alinhar uma função e estão ignorando a inline
dica.
editar: eu gostaria de aceitar as duas respostas, mas isso não é possível. Para encerrar a questão, estou aceitando a resposta do phresnel , porque ele 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 também corretas, de um ponto de vista diferente. .
O problema está na semântica do C ++, que não é rigorosa no caso de inline
palavras-chave e inlining. phresnel diz "escreva 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 os compiladores de reclamar sobre violações de ODR" como diz Puppy .
inline
apenas porque o modelo que foi especializado está marcado cominline
. Portanto,inline
o modelo é completamente irrelevante. Se essa função deveinline
ou não ter nada a ver com o fato de ser gerada por meio de uma especialização de modelo (e há respostas melhores do que as que abordam quando usarinline
). A resposta do @Puppy abaixo está correta, esta não está. A adiçãoinline
de um modelo é irrelevante eclang-tidy
, na verdade , será removida.inline
não é irrelevante, o exemplo deve cobrir o caso de se especializar explicitamentetemplate<> void f<>(int) {}
sem ainline
palavra - chave. Porém, mesmo assim, alterar oinline
especificador no modelo não faz diferença, porque a marcaçãoinline
ou não do modelo é irrelevante.É irrelevante. Todos os modelos já são
inline
- sem mencionar que, a partir de 2012, o único uso dainline
palavra-chave é parar os compiladores queixam-se de violações do ODR. Você está absolutamente correto - seu compilador da geração atual saberá o que incluir sozinho e provavelmente poderá fazê-lo mesmo entre unidades de tradução.fonte
inline
funções marcadas (ou seja, várias definições equivalentes podem ser passadas para o vinculador, que selecionará uma). Essa não é a função real dainline
palavra - chave.inline
. Talvez dê uma olhada na minha resposta abaixo (ou acima, dependendo da classificação escolhida). Para modelos não especializados, é claro que você está certo, mas formalmente não é o mesmo.inline
que deveria estar embutido. Geralmente não faz diferença, mas, em padrão, eles não são os mesmos e nem todos estão alinhados. Aceito sua posição dizendo: "É irrelevante", mas, por padrão, nem todos os modelos estão em linha, apenas para você como um usuário C ++ - eles aparecem como se.Como você sugeriu,
inline
é uma dica para o compilador e nada mais. Ele pode optar por ignorá-lo ou, de fato, incorporar funções não marcadas como incorporadas.O uso de
inline
modelos costumava ser uma maneira (ruim) de contornar o problema de que cada unidade de compilação criaria um objeto separado para a mesma classe de modelo, o que causaria problemas de duplicação no tempo do link. Ao usarinline
(eu acho), o nome mangling funciona de maneira diferente, contornando o conflito de nomes no tempo do link, mas à custa de um código muito inchado.Marshall Cline explica aqui melhor do que eu.
fonte
§14.5.5.1 p7 & p8
). Meu mal, eu removi o comentário errado.