Costumo usar o CGFloat por todo o lado, mas me pergunto se recebo um "desempenho insensato" com isso. O CGFloat parece ser algo "mais pesado" que o float, certo? Em que pontos devo usar o CGFloat e o que realmente faz a diferença?
Costumo usar o CGFloat por todo o lado, mas me pergunto se recebo um "desempenho insensato" com isso. O CGFloat parece ser algo "mais pesado" que o float, certo? Em que pontos devo usar o CGFloat e o que realmente faz a diferença?
Como @weichsel afirmou, CGFloat é apenas um typedef para um float
ou outro double
. Você pode ver por si mesmo clicando duas vezes em Command em "CGFloat" no Xcode - ele irá para o cabeçalho CGBase.h onde o typedef está definido. A mesma abordagem é usada para o NSInteger e o NSUInteger também.
Esses tipos foram introduzidos para facilitar a gravação de código que funciona em 32 bits e 64 bits sem modificação. No entanto, se tudo o que você precisa é de float
precisão no seu próprio código, você ainda pode usá- float
lo, se quiser - isso reduzirá um pouco a sua pegada de memória. O mesmo vale para valores inteiros.
Sugiro que você invista o tempo modesto necessário para limpar seu aplicativo em 64 bits e tente executá-lo dessa maneira, já que a maioria dos Macs agora possui CPUs de 64 bits e o Snow Leopard é totalmente de 64 bits, incluindo o kernel e os aplicativos do usuário. O Guia de transição de 64 bits da Apple para cacau é um recurso útil.
int
?CGFloat é um flutuador regular em sistemas de 32 bits e um duplo em sistemas de 64 bits
Então você não receberá nenhuma penalidade de desempenho.
fonte
Como já foi dito, o CGFloat é flutuante em sistemas de 32 bits e duplo nos sistemas de 64 bits. No entanto, a decisão de fazer isso foi herdada do OS X, onde foi tomada com base nas características de desempenho das CPUs PowerPC anteriores. Em outras palavras, você não deve pensar que float é para CPUs de 32 bits e o dobro é para CPUs de 64 bits. (Acredito que os processadores ARM da Apple foram capazes de processar duplos muito antes de serem 64 bits.) O principal impacto no desempenho do uso de duplos é que eles usam o dobro da memória e, portanto, podem ser mais lentos se você estiver executando muitas operações de ponto flutuante .
fonte
Objetivo-C
No código-fonte da Foundation, em CoreGraphics '
CGBase.h
:Direitos autorais (c) 2000-2011 Apple Inc.
Isto está fazendo essencialmente:
Onde
__LP64__
indica se a arquitetura atual * é de 64 bits.Observe que os sistemas de 32 bits ainda podem usar os de 64 bits
double
, apenas leva mais tempo do processador; portanto, o CoreGraphics faz isso para fins de otimização, não para compatibilidade. Se você não está preocupado com desempenho, mas com precisão, basta usardouble
.Rápido
No Swift,
CGFloat
existe umstruct
invólucroFloat
em arquiteturas de 32 bits ouDouble
de 64 bits (você pode detectar isso em tempo de execução ou compilaçãoCGFloat.NativeType
)No código-fonte CoreGraphics, em
CGFloat.swift.gyb
:* Especificamente, se
long
ponteiros, daí oLP
. Veja também: http://www.unix.org/version2/whatsnew/lp64_wp.htmlfonte
apenas mencione isso - Jan, 2020 Xcode 11.3 / iOS13
Swift 5
No código-fonte CoreGraphics
fonte