编译下面所示的代码,并检查反汇编 (
objdump -DSs a.out > a.dis
),我看不出调用 fun_ref(T &)
和 fun_const_ref(const T &)
会发生什么差异。因为参数(T)的类型是std::vector<int>
,所以没有区别吗?还是无论参数类型T是什么类型,调用的步骤都没有任何区别?
// g++ -std=c++17 -Wall -Wextra -pedantic -Wfatal-errors -Werror example_objdump.cc
// objdump -DSs a.out > a.dis
#include <iostream>
#include <vector>
void __attribute__ ((noinline)) fun_ref(std::vector<int> & rv, const int a)
{
std::cout << rv.at(a) << std::endl;
}
void __attribute__ ((noinline)) fun_const_ref(const std::vector<int> & crv, const int a)
{
std::cout << crv.at(a) << std::endl;
}
int main()
{
std::vector<int> v(128);
volatile int a{3};
v.at(a) = 1;
fun_ref(v, a);
v.at(a) = 2;
fun_const_ref(v, a);
return 0;
}
const
-限定符,除非在顶级对象变量的声明中应用,否则在编译的程序中没有任何意义。它的效果纯粹是编译时的。 const
限定符的唯一目的是确保不允许修改引用对象的表达式。
const
顶层对象变量的声明有点不同。在这种情况下,这也是对编译器的一个承诺,即该对象永远不会被程序修改,并且编译器可以进行相应的优化。有时可以在编译器的不同优化选择中看到这种差异。