调用函数时const指针参数如何优化?

时间:2012-03-08 05:03:04

标签: c pointers arguments compiler-optimization

编译器如何优化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 个答案:

答案 0 :(得分:4)

在任何这些情况下使用const来更清楚地表明您的使用目的并编写更易读的代码,现代编译器是高效且智能的,足以应用所需的优化,无论您是否将函数参数传递为{{ 1}}或不。

简而言之,在这种情况下使用const以提高可读性&防止使用错误,&不适用于编译器优化,
编译器很聪明,可以处理这个问题。

答案 1 :(得分:1)

请注意,前三个声明实际上都是相同的,即使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所说,最好从最简单的“你的意思”开始,如果你发现程序在程序的某些特定部分花了很多时间,那么只添加优化关键字。