Зачем использовать такие функции, как CGRectMake?

Мне любопытно, почему такие функции, как CGRectMake и CGPointMake существуют и широко используются. когда вместо этого вы можете сделать:

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

конечно, это более эффективно (хотя я догадываюсь не очень), поскольку нет вызова функции?

Также вы можете установить происхождение и размер, как:

 (CGRect){origin, size}

и в виде смеси:

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

В чем причина не использовать это и отдавать предпочтение функциям Make?

3 ответа

На самом деле это не более эффективно. CGRectMake функция (и другие) объявлены как static inlineЭто означает, что копия компилятора вставляет код функции прямо в каждое место, где он используется:

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

где

#  define CG_INLINE static inline

Вы идете из

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

в

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

который в принципе ничем не отличается от

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

после оптимизации компилятора и тому подобное.

Как сказано выше, вы добавляете зависимость от CGRect быть структурой из 4 чисел, выровненных определенным образом, в отличие от использования функции, которая имеет больше гарантий на это.

Я полагаю, это та же самая старая разница между:

  1. добавление зависимости в ваш код из внутреннего определения структуры данных;

  2. использование функции, которая инкапсулирует эти знания и которая может "маскировать" любые изменения в базовой структуре данных.

В принципе, CGRect может превратиться в полноценный класс с его origin, size, и т. д., средства доступа и т. д. Я не говорю, что это было бы разумно или вероятно, только потому, что причина, по которой вы используете функцию для создания экземпляров структуры данных, связана с устойчивостью вашего кода к изменениям.

Синтаксический литеральный синтаксис в C99 - немного неясная особенность. Некоторые люди считают функции Make более понятными для чтения, или они находят это более знакомым. На данном этапе поддержки набора инструментов это просто предпочтение.

Мне любопытно, почему существуют такие функции, как CGRectMake и CGPointMake…

CGRectMake (доступно с 10.0) предшествовало поддержке составных литералов компилятором OS X. Составные литералы были официально завершены в GCC 3.1 (май 2002 г.).

Другие вопросы по тегам