`
ruilin215
  • 浏览: 1148572 次
  • 性别: 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++编程语言创建一个玫瑰花图形的示例。代码利用了二维图形库EasyX,并在VC6.0或VC2010环境下编译。程序的原始版本由西班牙程序员Roman Cortes用JavaScript编写,后由...

    Google C++编程规范中文版

    - **局部变量 (Local Variables):** 局部变量应在尽可能靠近其首次使用的地点声明,以减少作用域范围,提高代码的可读性和维护性。 - **静态变量和全局变量 (Static and Global Variables):** 静态变量和全局变量...

    赛车游戏源代码_c++赛车编程_赛车网站源码_Vc_

    在C++中,我们可以定义一个变量来存储赛车的速度,并在合适的时间更新屏幕上的显示。为了模拟速度的变化,可能需要结合时间戳来计算速度增量,然后实时更新。 此外,游戏的交互性也是关键。在C++中,可以使用`cin`...

    软件设计---C++编码规范

    - 变量声明应在使用前,尽可能靠近其作用域的起始位置。 - 避免全局变量,除非绝对必要。 - 结构和类成员变量应初始化,避免未定义的初始状态。 ### 6. 函数、过程 - 函数应尽可能单一职责,避免过大和过于复杂的...

    腾讯C++编码规范

    规范中会规定代码中变量的声明应当尽量靠近其首次使用的位置,以减少变量作用域的范围,提高代码的可读性。同时,避免一次性声明未立即使用的一组变量。 5. 结构和函数 在结构体和函数的使用上,规范会规定适当的...

    C++使用递归算法求交错幂集

    递归函数的关键在于正确地定义基本情况和递归情况,并确保每次递归调用都向解决方案靠近一步。在本例中,递归函数通过不断缩小集合S的大小和减少目标交错幂集的元素数量,最终得到所有满足条件的交错子集。 总之,...

    Google C++ Style Guide(谷歌C++编码规范 )

    - **Local Variables**:局部变量应当尽可能靠近它们第一次使用的地点声明,以减少作用域范围。 - **Static and Global Variables**:静态变量和全局变量应当谨慎使用,因为它们可能引起副作用或降低代码的可测试...

    C/C++ Coding Guidlines

    - 例如,局部变量应该尽可能靠近其首次使用的位置声明;全局变量应在头文件中声明,并在单独的源文件中定义等。 ##### 4.3 编程风格 - **子节4.3.1**:缩进 - 规定了代码块的缩进方式,通常为每层缩进4个空格。 -...

    Google代码规范(C++)<中文>

    局部变量应尽可能地靠近其首次使用的位置定义,并且应该在最窄的作用域内声明。 **5. 全局变量(Global Variables)** 全局变量应当尽量少用,因为它们会导致代码难以理解和维护。如果确实需要使用全局变量,应当...

    数据结构与算法使用C++语言描述 期末复习PPT

    首先,C++部分涉及到函数原型、引用、操作符重载、友元、类的定义、构造函数和析构函数,以及内存的动态申请与释放。 1. 函数原型是函数声明的一种形式,它提供了函数的返回类型、名称和参数列表,确保编译器知道...

    高质量C++编程doc

    头文件的结构(1.2节)是C++编程的基础,它定义了类、函数和其他接口,而头文件的正确使用可以避免重复包含和编译问题。1.3节讨论了定义文件的结构,这涉及到源代码的组织方式,有助于提高代码的可读性和可维护性。...

    C++编程经典风格.docx

    2. **变量初始化**:总是尽可能在定义变量时就进行初始化,这有助于避免未初始化变量导致的潜在错误。 3. **代码格式化**: - 对于复杂的`for`、`while`等循环,简化表达式以保持代码简洁。 - 在`if`、`while`、`...

    高质量C++编程指南

    在代码风格方面,指南可能涵盖了修饰符的位置,如`const`、`volatile`等,这些应放置在最靠近变量的地方,以减少误解。此外,长行的拆分和缩进策略有助于保持代码整洁,使得阅读者可以快速理解代码的层次结构。 ...

    C++ 编程规范 经典必读

    变量声明应靠近其首次使用位置,以减少作用域和提高可读性。 #### 函数、过程规范 - 函数应具有单一职责,避免过长的函数,以利于代码的复用和维护。函数命名应直观,参数列表不应过长。 #### 可测性规范 - 代码应...

    C++相关学习总结和整理

    此外,类可以定义成员函数,而结构体通常只能定义成员变量,尽管在C++中结构体也可以拥有成员函数。 指针和数组是C++中的两种基本数据结构。数组是一块连续的内存空间,用于存储相同类型的数据,数组的大小在生命...

    基于C++实现的贪心算法源码.zip

    对于C++项目,可以使用调试工具如Visual Studio中的`Debug`模式进行断点调试,观察变量变化,确保算法按预期运行。 6. **文件组织**: 在`study_arith01.VC.db`和`study_arith01.sln`中,`VC.db`通常是Visual ...

    编程规范(C++)

    - const和volatile修饰符靠近所修饰的变量或函数参数。 #### 7. 注释 - 使用`//`进行单行注释,`/* */`用于多行注释。 - 注释清晰、简洁,解释代码的功能和目的。 - 更新注释以反映代码的变化。 #### 8. 类的版式 ...

Global site tag (gtag.js) - Google Analytics