在C中将函数的参数声明为const有什么用?它对性能有影响吗?
例如为什么您更喜欢f1而不是f2?还是f2到f1?
void f1(const char* arg) {
/* some code */
}
void f2(char* arg) {
/* some code */
}
答案 0 :(得分:3)
void f1(const char *arg)
中的参数arg
本身不是const
限定的,它被定义为指向该函数不应修改的char
数组的指针。乍一看,这对读者非常有用,即函数f1
不会修改它收到的字符串。
例如strcpy
在<string.h>
中声明为:
char *strcpy(char *dest, const char *src);
第一个参数指向的数组被修改,它是目标数组,第二个参数指向未经修改的源数组。
这种const
限定类型是病毒式的:一旦将参数定义为指向const
对象,则只能将其传递给具有类似const
限定参数的函数。 / p>
关于对性能的影响,没有负面影响。一些编译器甚至可能会从这种资格中受益,并生成更好的代码。
因此,在您的示例中,如果f1
不修改arg
指向的数组,除非您需要将f1
存储在类型为void (*)(char*)
的函数指针中,并且无法更改此类型,我强烈建议您使用:
void f1(const char *arg);
答案 1 :(得分:2)
const char* arg
表示arg
是指向常量char
的指针。如果您尝试更改arg
指向的数据,则会收到一条错误消息,内容为:error: assignment of read-only location ‘*arg’
。但是,您可以更改arg
中包含的地址。
与此相反,通过删除const
关键字,可以声明arg
指向 的数据。
您的偏好应基于您的需求。看看this了解更多信息。
针对您的评论:char * const arg
表示arg
是指向char
的常量(暂停一秒钟)指针。因此,您无法更改arg
中包含的地址,并且 可以更改位于该地址的数据。
答案 2 :(得分:2)
void foo(const char *arg)
声明指向const char的指针。您不能更改引用的对象,但可以更改指针
void foo(char * const arg)
声明指向char的const指针。您不能更改指针,但是可以更改引用的对象
void foo(const char * const arg)
声明指向const char的const指针。您不能更改指针和引用的对象
声明参数可以实现许多编译时间优化,并且可能对所生成代码的性能产生重大影响。
使用const
作为不应更改的参数和变量被认为是一种很好的做法。被称为“常量正确性”
更多阅读:restrict
关键字。
答案 3 :(得分:1)
您更喜欢
void f1(const char* arg)
如果您不想通过arg修改arg指向的对象。 但是您可以修改arg本身。
您更喜欢
void f2(char* arg)
如果要通过arg修改arg指向的对象。