临时变量正在拖慢你的程序

285 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

C++作为高效的语言一直为人所称道,但是有些不好的习惯也会降低程序的执行效率,比如临时变量的存在。临时变量的构造析构都是有成本的,那么如何降低这些成本?

何为临时变量

临时变量分为两类,一类为编译器生成,一类为程序员声明但未被使用的变量。总体可分为两大类三种情况。分别阐述如下:

编译器生成的临时变量:为满足函数调用进行自动类型转换而生成的临时变量, 编译器生成的临时变量:为函数返回值。
程序员声明的临时变量未被使用,即变量声明后在操作变量前函数返回了。

//编译器生成的临时变量——为满足函数调用
int countCahr(const string& str,char c);//计算str字符的ch的数量

char buffer[256];
char c;

countCahr(buffer,c);//此处便会通过buffer构造一个string的临时变量

//编译器生成的临时变量——函数返回值
const Rational operator+(const Rational& lhs,const Rational& rhs)
{
  Rational result(lhs.num+rhs.num,lhs.den+rhs.den);
  return result;
}

//程序员过早的定义变量
std::shared_ptr<UserInfo> getUserInfo()
{
  auto info = std::make_shared<UserInfo>();
  if()
  {
      reutrn nullptr;//该处条件不满足,直接返回
  }
  info->setId(100);
  info->setName("程序员的园")
  return info;
}

临时变量的危害

只要临时变量,便涉及到了构造和析构成本。C++内置的类型成本不会特别高,但是用户自定义类型的临时变量,那构造成本和析构成本可能就不容小觑了,在构造函数内涉及申请资源、析构函数释放资源的尤甚。

降低临时变量的成本

针对如上三种两大类的临时变量,分别与之对应的方法为:具体可参见代码

一种为满足函数调用进行自动类型转换而生成的临时变量——重新实现自己的函数或者 一种为函数返回值——利用返回值优化(RVO)
程序员声明但未被使用的变量——直到非用不可时才声明变量

int int countCahr(char[],int size,char c);//定义可以用char[]的函数
char buffer[256];
char c;

countCahr(buffer,c);

//编译器生成的临时变量——函数返回值
const Rational operator+(const Rational& lhs,const Rational& rhs)
{
    //编译将临时变量优化,将变量定义在接收返回值对象的内存空间上
  return result(lhs.num+rhs.num,lhs.den+rhs.den);
}

//程序员过早的定义变量
std::shared_ptr<UserInfo> getUserInfo()
{

  if()
  {
      reutrn nullptr;//该处条件不满足,直接返回
  }
  auto info = std::make_shared<UserInfo>();//直到非用不可时才声明
  info->setId(100);
  info->setName("程序员的园")
  return info;
}