【问题标题】:How does const pointer arguments optimized when calling functions?调用函数时如何优化 const 指针参数?
【发布时间】:2012-03-25 16:03:27
【问题描述】:
编译器如何优化这 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) { ... }
如果这很重要,您认为在调用函数时这些参数可能无法有效复制的情况下,将只读参数传递给函数的更好方法是什么?
【问题讨论】:
标签:
c
pointers
arguments
compiler-optimization
【解决方案1】:
在任何这些情况下使用const 来更清楚地表明您的使用目的并编写更易读的代码,现代编译器足够高效和智能,可以应用所需的优化,无论您将函数参数传递为const 还是不是。
简而言之,在这种情况下使用const 是为了提高可读性和防止使用错误,而不是为了编译器优化,
编译器足够聪明,可以处理这些问题。
【解决方案2】:
请注意,您的前三个声明实际上都是相同的,即使 SDL_Rect 是 typedef(因为 const 关键字从不“穿透” typedef,正如我喜欢说的那样)。
const 关键字在不同的地方以不同的方式起作用。在这种情况下,它只是做出一个(可撤销的)承诺,即 check_collision 不会改变或替换 *A(对于任何 i 也不会是 A[i]),也不会对 *B(对于任何 j 也不会是 B[j])。但是,代码调用的任何函数都可能修改 A[i] 和/或 B[i],因为底层对象可能是可修改的,而其他一些函数可能知道如何访问它们。 C99 关键字“restrict”告诉编译器并非如此,并提供了很多优化的机会;这通常是你想要的。
C99 还添加了“static”关键字的新用法,以启用某些编译时优化,这些优化超出了“restrict”提供的优化。这些仅适用于指针指向数组的第一个元素,其大小至少是某个已知值。 (它主要用于矢量化。)
正如@Als 所指出的,最好从最简单的“你的意思”陈述开始,并且仅在您发现程序在程序的某些特定部分花费大量时间时才添加优化关键字。