C++技巧之栈变量的析构应用 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
栈变量有一个好处,就是它退栈时会自动析构,并且在栈上对象生成比在堆上分配效率高很多。但每个线程的栈空间是有限的(创建线程时可以设置),所以一般的临时小对象都会在栈上分配。
struct Test {};void test(){Test stack_var; // a stack var;Test stack_var2; //a stack var;int *heap_var = new int; // a heap var}上述的例子,stack_var与stack_var2都是一个栈变量,当然stack_var与stack_var2谁先从栈中分配,不的操作系统,内存管理方式也略有区别。更深一点讲,heap_var这个指针值也是一个栈变量承载,但heap_var所指的地址内容才是从堆上分配的内存空间。当退出test这个函数时,stack_var与stack_var2都会先调用Test的析构,再把其所在的内存空间回收到线程栈中。
在一些场景下,我们可以利用栈变量当退栈时会自动析构这特性,下面我将举两个应用例子。
析构方法释放内存从堆上面new出来的对象,在一个方法条件分支比较多的情...阅读全文

C++的仿函数与动态语言的闭包 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
用Python写就没有那么好看。
闭包(Closure)是词法闭包(Lexical Closure)的简称。对闭包的具体定义有很多种说法,这些说法大体可以分为两类:
一种说法认为闭包是符合一定条件的函数,闭包是在其词法上下文中引用了自由变量的函数。另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。比如参考资源中就有这样的的定义:在实现深约束时,需要创建一个能显式表示引用环境的东西,并将它与相关的子程序捆绑在一起,这样捆绑起来的整体被称为闭包。这两种定义在某种意义上是对立的,一个认为闭包是函数,另一个认为闭包是函数和引用环境组成的整体。虽然有些咬文嚼字,但可以肯定第二种说法更确切。闭包只是在形式和表现上像函数,但实际上不是函数。函数是一些可执行的代码,这些代码在函数被定义后就确定了,不会在执行时发生变化,所以一个函数只有一个实例。闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。所谓引用环境是指在程序执行中的某个点所有处于活跃状态的约束所组成的集合。其中的约束是指一个变量的名字和其所代表的对象之间的联系。那么为什么要把引用环境与函数组合起来呢?...阅读全文

[C++] STL容器中erase方法的不同陷阱 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
STL中的容器都有erase方法,容器的存储分为顺序存储(如vector)与链式存储(如list,map)。先以map为例:
typedef std::map<std::string, std::string> TStrMap;typedef TStrMap::iterator TStrMapIter;TStrMap strmap;TStrMapIter iter = strmap.find("somekey");strmap.erase(iter);这样使用erase方法没有任何问题,删除一个单结节之后,stl中的iterator都是与其中的数据元素关联的,关联的元素删除之后,iter已就失效,iter理解为指向元素的指针,那删除之后可以简单理解为已是一个野指针。
但有时我们一不注意,却会这样使用,这是错误的:
for(TStrMapIter iter= strmap.begin(); iter!= strmap.end();++iter){if ("somevalue" == iter->second ){strmap.erase(iter);}}iter所指的元素删除之后,...阅读全文

面向对象的设计原则 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
较高的生产效率较高的软件质量恰当使用复用可改善系统的可维护性在面向对象的语言中,数据的抽象化、继承、封装和多态性是几项最重要的语言特性,这些特性使得一个系统可以在更高的层次上提供可复用性。数据的抽象化和继承关系使得概念和定义可以复用;多态性使得实现和应用可以复用;而抽象化和封装可以保持和促进系统的可维护性。
在一个设计得当的系统中,每一个模块都相对于其它模块独立存在,并只保持与其它模块的尽可能少的通信。这样一来,在其中某一个模块发生代码修改的时候,这个修改的压力不会传递到其它的模块。
常见的设计原则有:
“开闭”原则(Open-Closed Principle)
“开闭”原则讲的是:一个软件实体应当对扩展开放,对修改关闭。其英文原文是:Software entities should be open for extension,but closed for modification.满足开闭原则的设计可以给一个软件系统两个无可比拟的优越性:1.通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活必。2.已有的软件模块,特别是最重...阅读全文

家有老人 - 蘭陵N散記

作者:JerryXia | 发表于 , 阅读 (0)
昨天去一了趟广州小叔那,我去看爷爷。岁月催人老,一晃我爷爷马上80岁了。我差不多每一年才与他见面一次,主要是回家过年时。每次见到他,都感觉他越来越苍老,不过今年他的身体还不错,希望他能健康百岁。
老人真像小孩一样,有时也会拿我开涮一下,他说他与奶奶在一起有60年了,正好有一花甲了。他说这一次要在广州多呆一段时间,要看广州这边国庆热闹。国庆之后,一定要做飞机回去,说一辈了还没有坐过飞机,总爱喜欢问一些关于飞机上的事,我只得一一回答。这次老人在广州呆着还是很愉快的,说广州比家里热多了,他喜欢天天呆在有空调的房子里不爱出去。他喜欢渴点酒,一天总是端一个杯子,我就劝他少渴点,也总是笑着对我说润润嘴巴。
...阅读全文