Как оптимизируются аргументы указателя const при вызове функций? - PullRequest
1 голос
/ 08 марта 2012

Как компиляторы оптимизируют эти 4 типа определений функций. Есть ли какая-либо оптимизация в смысле передачи аргументов?

int check_collision(const SDL_Rect const *A,const SDL_Rect const *B) { ... }

int check_collision(SDL_Rect const *A,SDL_Rect const *B) { ... }

int check_collision(const SDL_Rect *A, SDL_Rect const *B) { ... }

int check_collision(SDL_Rect *A, SDL_Rect *B) { ... }

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

Ответы [ 2 ]

4 голосов
/ 08 марта 2012

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

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

1 голос
/ 08 марта 2012

Обратите внимание, что ваши первые три объявления фактически одинаковы, даже если SDL_Rect является typedef (потому что ключевое слово const никогда не "проникает" в typedef, как я бы хотел это выразить).

Ключевое слово const действует по-разному в разных местах. В этом случае он просто дает (отзывное) обещание, что check_collision не изменит и не заменит * A (ни A [i] для любого i), ни * B (ни B [j] для любого j). Однако, возможно, что A [i] и / или B [i] модифицируются любой функцией, которую вызывает ваш код, потому что базовые объекты могут быть модифицируемыми, и некоторые другие функции могут знать, как получить к ним доступ. Ключевое слово C99 «restrict» сообщает компилятору, что это не так, и предоставляет много возможностей для оптимизации; это обычно то, что вы хотите здесь.

C99 также добавляет новое использование для ключевого слова «static», чтобы включить определенные оптимизации во время компиляции, которые выходят за рамки тех, что предусмотрены «restrict». Они применяются только в том случае, если указатели указывают на первый элемент массивов, размер которого равен по крайней мере некоторому известному значению. (В основном это для векторизации.)

Как заметил @Als, лучше всего начинать с самого простого выражения «что вы имеете в виду» и добавлять ключевые слова для оптимизации только в том случае, если вы обнаружите, что программе отводится много времени в какой-то конкретной части (ях) программы.

...