C++对基本数据类型进行const T&有意义吗

我们都知道,const T&这种形式的参数可以避免拷贝,从而提高性能。但是几乎没有人会对基本数据类型写这样的参数。这是因为这样做并不能提高性能。

在底层上,按引用传递其实还是通过传地址实现的,但是这就有一个问题:传入的地址上的值是可以被用户随意修改的。这就意味着每次处理完这个值后,缓存在寄存器中的此变量值将会无效,编译器不得不从Cache或者内存中再次得到这个值。这个操作的开销在基本数据类型的情况下可能会比拷贝产生的开销更大。

你可能会说:我这里标了const了,明确了不会被改变了啊。但是编译器并不能做到这一点(或者说保证这一点),因为有一些方式可以改变值:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
void Modify(const int& value1) {
    a = 123;
}
// call:
// a 是全局变量
// Modify(a);


void Modify(const int& value) {
    int& b = const_cast<int&>(value);
    b = 32;
}
// call: Modify(a);

第一种情况是在函数中虽然传入了const引用,但是a是全局变量,在这种情况下const引用就没有意义。

第二种情况是使用const_cast将常量引用转为普通引用,从而改变参数的值。

但是在函数inline的时候,编译器可能可以通过调用者和被调用者的信息推断出参数是否可以被修改,尤其是对于模板函数。

updatedupdated2023-06-182023-06-18