19

Tengo curiosidad por qué funciones como CGRectMake y CGPointMake existen y son ampliamente utilizadas. cuando, en cambio, que puede hacer:¿Por qué usar funciones como CGRectMake?

(CGRect){{x, y}, {width, height}} 

sin duda esto es más eficiente (aunque supongo que no por mucho) ya que no hay llamada de función?

También puede establecer el origen y el tamaño como:

(CGRect){origin, size} 

y como una mezcla:

(CGRect){origin, {width, height}} 

¿Cuál es la razón para no usar esto, y prefiriendo las funciones hacen?

Respuesta

8

supongo que es la misma diferencia de edad entre:

  1. añadiendo una dependencia en el que el código de la definición interna de una estructura de datos;

  2. usando una función que encapsula ese conocimiento y que podría "enmascarar" cualquier cambio en la estructura de datos subyacente.

En principio, CGRect podría convertirse en una clase en toda regla con su origin, size, etc, descriptores de acceso, etc ... No estoy diciendo que esto sería sensible o que es probable, sólo que la razón Por qué usa una función para crear instancias de una estructura de datos tiene que ver con la resiliencia de su código a los cambios.

13

No es más eficiente, en realidad. La función CGRectMake (y otros) se declaran como static inline, lo que significa que la copia del compilador Pega el código de función directamente en cada lugar se usa:

CG_INLINE CGRect 
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) 

donde

# define CG_INLINE static inline 

Se pasa de

// code 
CGRect myRect = CGRectMake(1,2,3,4); 
// code 

a

// code 
CGRect myRect; 
myRect.origin.x = 1; myRect.origin.y = 2; 
myRect.size.width = 3; myRect.size.height = 4; 

que en principio no es diferente de

CGRect myRect = (CGRect){1,2,3,4}; 

después de las optimizaciones del compilador y tal.

Como dije anteriormente agregas una dependencia en CGRect siendo una estructura de 4 números alineados de cierta manera en lugar de usar una función que tiene más garantía.

6

La sintaxis literal del Compuesto C99 es una característica oscura algo oscura. Algunas personas consideran que las funciones de Make son más claras para leer, o les resulta más familiar. En esta etapa del soporte de toolchain, es meramente preferencia.

tengo curiosidad por qué existen funciones como CGRectMake y CGPointMake ...

CGRectMake (disponible desde 10,0) precedido apoyo de compilador de OS X de literales compuestos. Los literales compuestos se completaron oficialmente en GCC 3.1 (mayo de 2002).

Cuestiones relacionadas