揭示编译器在传递给引用与传递给 const 引用时所做的事情

问题描述 投票:0回答:1

编译下面所示的代码,并检查反汇编 (

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;
}                                                                                                                                                                                                                                                                                                               
c++ performance constants pass-by-reference disassembly
1个回答
0
投票

const
-限定符,除非在顶级对象变量的声明中应用,否则在编译的程序中没有任何意义。它的效果纯粹是编译时的。
const
限定符的唯一目的是确保不允许修改引用对象的表达式。

const
顶层对象变量的声明有点不同。在这种情况下,这也是对编译器的一个承诺,即该对象永远不会被程序修改,并且编译器可以进行相应的优化。有时可以在编译器的不同优化选择中看到这种差异。

© www.soinside.com 2019 - 2024. All rights reserved.