`
ruilin215
  • 浏览: 1104376 次
  • 性别: Icon_minigender_2
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

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++修改系统环境变量

    c++实现修改环境变量,原帖地址忘记了,是在网易博客上找到的,分享给大家。

    C/C++语言中全局变量重复定义问题的解决方法

    宏定义、结构体定义、函数声明以及全局变量定义放到一个head.h头文件中 函数的定义放到head.cpp中 main函数放到main.cpp中 然而却报错了,提示xxx变量在*.obj文件中已定义 问题出现的原因 为什么会出现这种...

    C++编程变量命名规范

    C++变量命名规范,有关项目的全局变量用g_开始,类成员变量用m_,局部变量若函数较大则可考虑用l_用以显示说明其是局部变量

    C++全局变量初始化的一点总结

    注意:本文所说的全局变量指的是 variables with static storage,措词来自 c++ 的语言标准文档。  什么时候初始化  根据 C++ 标准,全局变量的初始化要在 main 函数执行前完成,常识无疑,但是这个说法有点含糊...

    C++中类使用全局变量

    在C++中,声明一个类,并且定义一个全局变量,练习全局变量的使用。注意全局变量的使用技巧和方法。

    C++变量总结 说明各种变量

    在C语言中,变量是对程序中数据所占用内存空间的一种抽象,定义变量时,用户定义变量的名,变量的类型,这是变量的操作属性。不仅可以通过变量名访问该变量,系统还通过该标识符确定该变量在内存空间的位置。在...

    C++——字符串变量.txt

    处理字符串,除了字符数组,还有用C++的string类型来定义一个字符串变量(对象)。 定义字符串并进行初始化: string string1="chance"; 注意:必须要有头文件# include ; 比较:字符数组不能直接对字符变量进行...

    C++变量名规则

    常见的C++语言中变量名称的命名规则,基本涵盖了常用的一些变量说明

    定义全局变量 变量 全局

    用MFC制作的工程由很多文件构成,它不能象一般C++程序那样随意在类外定义全局变量,在这里要想定义能被工程内多个文件共享的全局变量和函数必须用一些特殊方法才行。实际上有多种方法可以实现,这里只介绍两种方法。

    一个案例 c++ 局部变量 全局变量 形式参数 实际参数练习.cpp

    一个案例 c++ VS2017 局部变量 全局变量 形式参数 实际参数练习 一个案例 c++ VS2017 局部变量 全局变量 形式参数 实际参数练习 一个案例 c++ VS2017 局部变量 全局变量 形式参数 实际参数练习

    C++类变量声明

    C++类变量声明,验证与java类声明不同的Demo

    解决C++全局变量只能初始化不能赋值的问题

    C++中,全局变量只能声明、初始化,而不能赋值 也就是说,下面这样是不被允许的: #include using namespace std; int a; a = 2; int main() { return 0; } 错误提示是: C++ requires a type specifier for all...

    C_C++变量命名规则

    C_C++变量命名规则, 山高谷深

    详解c++ 静态成员变量

    C++的static关键字可修饰类成员变量/方法,表示变量/方法不从属于特定对象,而是属于类的。仔细琢磨静态成员变量,会发现其与C++的方式既相容也矛盾,具有特殊性。 先说相容的一面。·C/C++·有声明和定义的说法:...

    C++变量命名规则

    主要是C++变量命名规则的一些常规用法。

    C++中的extern声明变量详解

    从内存分配角度来说,声明和定义的区别在于声明一个变量不会分配内存,而定义一个变量会分配内存。一个变量可以被声明多次,但是只能被定义一次。 基于以上前提,我们可以把声明和定义类比为指针和内存的关系。我们...

    深入解析C++中的临时变量

    从操作系统底层 深入解析C++中的临时变量

    C++各变量的区别

    C++ 全面基础知识要点之变量 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,...

    变量取值范围(c++)

    定义为LONG64。 为什么会出现long int呢?在win32现在系统中,长度为4;在历史上,或者其他某些系统中,int长度为2,是short int。 即便是long long,在TI的有款平台中,长度为5也就是说,每种类型长度,需要sizeof...

    C++和C#变量对应表

    C++和C#变量对应表 方便需要使用c#调用c++写的dll 时接口变量的查找对比

Global site tag (gtag.js) - Google Analytics