关于全局与静态变量的思考

关于全局与静态变量的思考

阅读了风云的书《游戏之旅-我的编程感悟》,其中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;

}

上面这个例子会发现,第二次申请的数据将第一次申请的数据覆盖了。(为了简单,我没有做空间释放,这里的空间释放是必须调用析构函数释放的)。

将注释的内容写过来,便可修改。

以上都是对于多次申请空间的考虑。

如果是一个小程序,只需要维护一个变量的话。那么个人认为静态变量是较好的。(省去了相对麻烦的代码维护)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值