C++“靠近定义变量“之真正原因

2024-03-07 19:38

本文主要是介绍C++“靠近定义变量“之真正原因,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在C++中,都知道要“尽量靠近变量实际使用处进行定义”。对此条规则一般的理解是:这是C++对C“函数开始处进行变量定义”的一种优化,目的是方便程序员定义和使用变量。最近学习时发现,这个规则实际上和C++“面向对象的编程语言”本质密切相关。
考虑如下的类定义和代码段:

class X
{
public:
  X() : m_number(2);
  ~X();
  void SetNumber(int number){m_number = number;};
  int GetNumber(){return m_number};
private:
  m_number;
};

int main(int argc, char* argv[])
{
  X x1;
  X x2;

  if (x1.GetNumber() == 0)
  {
    return 0; // 第一个return
  }

  if (x2.GetNumber() == 2)
  {
    return 0; // 第二个return
  }

  return 0; // 最后的return
}

这段代码申明了两个X的局部变量,x1和x2。如果按照C的申明方式把两个变量放在函数的开始处,那么,编译器在每个return返回处都必须对x1和x2调用析构函数。
如果把代码改成如下形式:

int main(int argc, char* argv[])
{
  X x1;
  if (x1.GetNumber() == 0)
  {
    return 0; // 第一个return
  }
  X x2;
  if (x2.GetNumber() == 2)
  {
    return 0; // 第二个return
  }

  return 0; // 最后的return
}

也就是在使用x2前才申明x2,则第一个return处编译器就不用加入对x2析构函数的调用了。

如果函数申明了比较多的对象,而且函数析构的开销比较大,则“使用前才申明”就能可观地减小代码尺寸和运行时开销。由此观之,本条规定的来源实际上是:“C++是面向对象的编程语言,编译器会插入很多编程者未书写的代码来达成面向对象语义,如果不遵循该规则,这些编译器添加的代码会造成较大的开销”。

C++中,很多似乎无关紧要的规则都有其深刻的含义,不是随便规定的。

这篇关于C++“靠近定义变量“之真正原因的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/784606

相关文章

Django中的函数视图和类视图以及路由的定义方式

《Django中的函数视图和类视图以及路由的定义方式》Django视图分函数视图和类视图,前者用函数处理请求,后者继承View类定义方法,路由使用path()、re_path()或url(),通过in... 目录函数视图类视图路由总路由函数视图的路由类视图定义路由总结Django允许接收的请求方法http

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

C++中detach的作用、使用场景及注意事项

《C++中detach的作用、使用场景及注意事项》关于C++中的detach,它主要涉及多线程编程中的线程管理,理解detach的作用、使用场景以及注意事项,对于写出高效、安全的多线程程序至关重要,下... 目录一、什么是join()?它的作用是什么?类比一下:二、join()的作用总结三、join()怎么

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被