Existe uma maneira em rápida para declarar uma função inline?

votos
26

Eu sou muito novo para a linguagem rápida

Eu queria declarar uma função inline assim como em c ++ por isso a minha declaração divertido é como

func MyFunction(param: Int) -> Int {
...
...
...
}

e eu quero ti fazer algo como

inline func MyFunction(param: Int) -> Int {
...
...
...
}

Tentei pesquisar na web, mas eu não encontrei nada relevante talvez não há nenhuma palavra-chave inline mas talvez haja outra maneira para inline a função

Muito Obrigado :)

Publicado 10/01/2015 em 18:46
fonte usuário
Em outras línguas...                            


3 respostas

votos
39

Swift 1,2 irá incluir o @inlineatributo, com nevere __alwayscomo parâmetros. Para mais informações, veja aqui .

Como dito antes, você raramente precisa declarar uma função explicitamente como @inline(__always)porque Swift é bastante inteligente a respeito de quando uma função inline. Não ter uma função inline, no entanto, pode ser necessário em algum código.

Respondeu 29/03/2015 em 16:10
fonte usuário

votos
9

Todo o crédito para a resposta , apenas resumindo as informações da ligação .

Para fazer uma função inline basta adicionar @inline(__always)antes da função:

@inline(__always) func myFunction() {

}

No entanto, vale a pena considerar e aprender sobre as diferentes possibilidades. Há três maneiras possíveis para inline:

  • às vezes - irá certificar-se, por vezes, inline função. Este é o comportamento padrão, você não tem que fazer nada! Compilador Swift pode in-line automaticamente funciona como uma otimização.
  • sempre - irá certificar-se sempre inline função. Alcançar esse comportamento adicionando@inline(__always)antes da função. Use "se a sua função é bastante pequeno e você preferir seu aplicativo correu mais rápido."
  • Nunca - irá certificar-se de nunca inline função. Isto pode ser conseguido através da adição@inline(never)antes da função. Use "se a sua função é bastante longo e você quer evitar aumentar seu tamanho segmento de código."
Respondeu 28/05/2017 em 18:08
fonte usuário

votos
0

Me deparei com uma questão que eu precisava usar @inlinablee @usableFromInlineatributos que foram introduzidas no Swift 4.2 assim que eu gostaria de compartilhar minha experiência com você.

Deixe-me ir direto ao assunto, porém, nossa base de código tem um módulo de Analytics da fachada que liga outros módulos.

App Target -> módulo Analytics Fachada -> Relatórios módulo X.

Módulo Analytics Fachada tem uma função chamada report(_ rawReport: EventSerializable)que disparar as chamadas de relatórios, esta função usa uma instância do módulo de relatórios X para enviar as chamadas de relatórios para que os relatórios específicos módulo X.

A coisa é, chamando que report(_ rawReport: EventSerializable)funções muitas vezes para enviar as chamadas de relatórios uma vez que os usuários iniciar o aplicativo cria sobrecarga inevitável que causou uma série de acidentes para nós.

Além disso, não é uma tarefa fácil de reproduzir essas falhas se você estiver configurando o Optimisation levelpara Noneo modo de depuração. No meu caso eu era capaz apenas para reproduzi-lo quando eu definir o Optimisation levelpara Fastest, SmallesT ou ainda maior.

A solução foi a utilização de @inlinablee @usableFromInline.

Usando @inlinablee @usableFromInlineexportar o corpo de uma função como parte da interface de um módulo, tornando-o disponível para o otimizador quando referenciado a partir de outros módulos.

O @usableFromInlineatributo marca uma declaração interna como sendo parte da interface binária de um módulo, permitindo que ele seja usado de @inlinablecódigo sem expô-lo como parte da interface de origem do módulo.

Através dos limites do módulo, os genéricos de tempo de execução introduzir sobrecarga inevitável, como tipo reified metadados deve ser passada entre as funções, e vários padrões de acesso indirecto deve ser utilizado para manipular os valores de tipo genérico. Para a maioria das aplicações, essa sobrecarga é insignificante em comparação com o trabalho real executado pelo próprio código.

Um cliente binário construído contra esse quadro pode chamar essas funções de genéricos e desfrutar de uma possível melhora o desempenho quando construído com otimizações habilitadas, devido à eliminação de sobrecarga abstração.

Código de amostra:

@inlinable public func allEqual<T>(_ seq: T) -> Bool
    where T : Sequence, T.Element : Equatable {
        var iter = seq.makeIterator()
        guard let first = iter.next() else { return true }

        func rec(_ iter: inout T.Iterator) -> Bool {
            guard let next = iter.next() else { return true }
            return next == first && rec(&iter)
        }

        return rec(&iter)
}

Mais informações - Cross-módulo inlining e especialização

Respondeu 02/08/2019 em 23:23
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more