关于全局与静态变量的思考
阅读了风云的书《游戏之旅-我的编程感悟》,其中6.2.2节(P140),关于全局与静态变量。
个人认为风云讲解不够详细。而且,静态变量是在栈上的,动态变量是在堆上的。
这里我们先说明一下,placementnew的操作与普通的new操作的区别。
他们的原理是相同的。都是在堆里随机申请一块空间供我们使用。
然而对于new来说,每次我们释放所申请的空间,下次再次new申请空间时,计算机会重新寻找满足我们需求大小的位置。
对于placementnew来说,我们每次每个对象申请的空间都在第一次申请的大空间里。这样就会减少相当于new操作时每次申请新空间计算机寻找满足需求大小的位置的时间。我们只需要寻找一次。而相对于new的另一个优势就是空间时不间断连续的。
但是placementnew也有缺陷,需要我们自己跟踪指针位置。防止数据重叠。
例:
#include "stdafx.h"
#include <new>
#include "iostream"
using namespace std;
class CTest
{
public:
inta;
CTest()
{
a= 3;
}
CTest( int b)
{a = b;}
/* 代码*/
};
int main(int argc, char* argv[])
{
// 由于这个例子的目的,我们不考虑内存对齐问题
cout<<sizeof(CTest)<<endl;
char strBuff[sizeof(CTest)*10+100];
cout<<&strBuff<<endl;
CTest * pBuffer = (CTest*)strBuff;
cout<<pBuffer<<endl;
CTest * pFirst = new(pBuffer) CTest(2);
cout<<pFirst->a<<endl;
cout<<pFirst<<endl;
CTest * pSecond = new(pBuffer) CTest(1);// CTest * pSecond = new(pBuffer+1)CTest(1)
cout<<pSecond->a<<endl;
cout<<pSecond<<endl;
cout<<pFirst->a<<endl;
cout<<pFirst<<endl;
return 0;
}
上面这个例子会发现,第二次申请的数据将第一次申请的数据覆盖了。(为了简单,我没有做空间释放,这里的空间释放是必须调用析构函数释放的)。
将注释的内容写过来,便可修改。
以上都是对于多次申请空间的考虑。
如果是一个小程序,只需要维护一个变量的话。那么个人认为静态变量是较好的。(省去了相对麻烦的代码维护)。