CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

多用静态变量有什么坏处?

楼主sunlu_eric(天使预备役)2005-06-01 10:13:33 在 C/C++ / C++ 语言 提问

如题!! 问题点数:20、回复次数:26Top

1 楼mccxj(老鼠不逛街)回复于 2005-06-01 10:15:40 得分 1

内存空间问题。。。Top

2 楼zhousqy(标准C匪徒)(甩拉,甩拉)回复于 2005-06-01 10:35:21 得分 1

没必要的时候就不要用。Top

3 楼mccxj(老鼠不逛街)回复于 2005-06-01 10:37:33 得分 1

还有。。静态是很有用的。。不过同意楼上的。。除非真的好处明显。不然就不用了。。Top

4 楼nicknide(封月翔天)回复于 2005-06-01 10:51:23 得分 1

没有坏处,只要你用得恰倒好处,而且有些地方也无可避免Top

5 楼foochow(无聊,灌水......)回复于 2005-06-01 10:55:13 得分 1

该出手时就出手~~~-_-Top

6 楼whyglinux(山青水秀)回复于 2005-06-01 12:18:28 得分 1

一个问题就是上面提到的内存空间的使用问题。静态空间在程序结束之前一直存在,从而造成内存空间使用率不高。  
   
  另一个问题就是如果在函数中使用了静态变量,那么这个函数就会保存上一次调用的一个状态,有时这会导致一些比较微妙的错误。特别的,这样的函数是不可重入的,不能在多线程或者多进程中进行使用。  
   
  所以,一个基本原则就是尽量不要使用静态内存,除非必须。Top

7 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-06-01 12:32:01 得分 1

一般原则是尽量使用自动变量,不到必须的情况下不要使用静态和外部变量Top

8 楼sunlu_eric(天使预备役)回复于 2005-06-01 15:14:08 得分 0

但如果我用一个静态数组就不许要总申请空间了,而用一个局部的总需要释放,申请,这个  
  难道不耗费系统时间,同时不知道这样的频繁的申请数组空间(几千个字节一次)是不是有什么隐患么!Top

9 楼luckyrain()回复于 2005-06-01 15:31:52 得分 1

有隐患,会把大内存块分成小内存块。Top

10 楼stkane(左手无名指)回复于 2005-06-01 15:45:54 得分 1

但还是不要用,因为如果你要用静态变量的数组的话,这个静态变量需要很大的内存,这些内存一只会放到程序结束。。。  
  如果你仅仅是那个原因的话,你可以在堆上分配内存,开一个数组,然后共享这块内存的指针。除了初始化会遇到点问题。。。Top

11 楼lucymary1982()回复于 2005-06-01 16:26:21 得分 1

增加软件个模块的耦合度,不是太好Top

12 楼jingyueid(干宁)回复于 2005-06-01 17:24:19 得分 1

确如:   whyglinux老大所说的,内存利用率不高。  
  函数中的静态变量还会导致函数功能过于藕荷,单一,不利于模块化。Top

13 楼zdy_8212(zdy_8212)回复于 2005-06-02 04:28:11 得分 1

数据共享Top

14 楼sunlu_eric(天使预备役)回复于 2005-06-02 08:44:17 得分 0

stkane(左手无名指)  
  我的变量就要是一直用到程序结束的,所以才说申请成静态数组,这时候用比次次申请好了吧!Top

15 楼chenkong()回复于 2005-06-02 10:47:06 得分 1

主要是破坏了面向对象的编程思维.其实用不用完全是根据需求来定的.在面向对象的编程下的确要慎用.除非你打算只是自己用这个代码(其实就算是自己用,时间久了也难免在静态变量上栽跟头).如果根据需求你没打算面向对象的编程,比如面向过程的编程,那就不必过于担心Top

16 楼stkane(左手无名指)回复于 2005-06-02 15:54:46 得分 1

没错阿,你可以这样做  
  static   SomeClass*   p=NULL;  
   
  //第一次用的时候  
  if(p=NULL)  
      p=new   SomeClass[SIZE];  
  ...  
  p[i]=...  
  ...  
  //程序结束之前,  
  delete[]   p;  
   
  这不是指分配了一次吗?而且静态的只有p一个而已。你要知道  
  sizeof(p)==4;//32位的系统  
  但是如果  
  satic   SomeClass   arr[100];  
  sizeof(arr)==100   *   sizeof(SomeClass);  
  所以说你的程序有问题。  
   
  Top

17 楼stkane(左手无名指)回复于 2005-06-02 16:06:14 得分 1

也可以把这个指针放在一个类里面,这个看你的程序规模决定,这个方法从一定程度上可以降低他们所说的耦合性:  
  class   MyClass  
  {  
  public:  
      enum  
      {  
          SIZE=100;//设置你需要的值  
      };  
  ...//省略  
  public:  
      static   SomeClass*   p__;  
  ...//省略  
  };  
   
  SomeClass*   MyClass::p__=new   SomeClass[SIZE];//如果失败的话MyClass::p__==NULL;  
   
  ...//省略  
   
  //使用的时候.不需要创建MyClass的任何实例  
  MyClass::p__[i]=...;  
   
  //程序结束之前  
   
  if(MyClass::p__[i]!=NULL)  
      delete[]   MyClass::p__;  
   
  你不要听其他人说的什么耦合度问题。这些很少会出问题,而且有许多方法解决。这是一个方法。另外一个方法就是使用namespace。不过太繁了。现在这样就不会产生什么名称的冲突,你只要注意这样几个问题:  
  1。这个数组可能赋初值要用特殊的办法。就是说,你可能需要再创建一个临时数组,对这个临时数组赋初值,然后把这个临时数组里面的东西复制到(memcpy会很快)MyClass::p__下面的数组里面。  
  2。在程序结束之前,记得把内存释放掉。不要依赖于操作系统对程序内存的控制(理论上说,操作系统会在一个进程结束后,把所分配过的内存都回收。但是,可能别人会把你的代码拿去用,这样就会内存泄漏了。)  
  没了。。。  
  Top

18 楼stkane(左手无名指)回复于 2005-06-02 16:07:28 得分 1

上面写错了应该是  
   
  //程序结束之前  
   
  if(MyClass::p__!=NULL)  
      delete[]   MyClass::p__;  
   
  Top

19 楼july81(鸟)回复于 2005-06-02 16:22:40 得分 1

不同模块中的静态初始化顺序也是不确定的,这个可能带来问题。Top

20 楼Non_miracle(CSDN小七)回复于 2005-06-02 16:41:11 得分 1

使得程序的可移植性不好!Top

21 楼stkane(左手无名指)回复于 2005-06-02 18:06:41 得分 1

。。。建议大家去看看C++之父写的《C++的设计与演化》,C++的思想就是,每一个问题的解法都不是唯一的,每一个解法在特定的情况下都可能存在问题,不存在效率和安全同时达到极限的方法。C++从不勉强一个人用任何固定的方法来实现他想要做到的事情。这个是和Java不一样的地方。如果希望程序既没有耦合,又高效,又可移植,那么就不要用C++了,事实上,什么程序也不要写了Top

22 楼yuanyou(元友)回复于 2005-06-02 19:13:59 得分 0

学习。。。。Top

23 楼visual4825()回复于 2005-06-02 21:23:35 得分 1

对于non-local   static   object的初始化过程中抛出异常,   唯一获得控制的方法就是调用  
   
  set_unexcepted();   另外,   没有办法捕捉global   object的初始化过程中抛出的异常,  
   
  所以,以上也是尽可能避免使用全局对象和静态对象的原因之一Top

24 楼lilin_2005(lihua)回复于 2005-06-05 16:41:50 得分 0

静态变量,破坏了对象的封装,特别目的(ie:singleton)才用.Top

25 楼Spacesoft(暗夜狂沙)回复于 2005-06-07 19:51:19 得分 0

在多线程的情况下容易出问题,假如不加注意的话。  
  当然咯,假如你非得说“俺很仔细,俺多线程访问静态变量都加了锁的”,那也没办法,呵呵Top

26 楼Iambest(飞翔的雄鹰)回复于 2005-06-08 13:34:16 得分 0

有的时候是必须在用static的,比如用自己实现一个队例,用多线程控制Top

相关问题

  • 静态变量
  • 静态变量与普通变量有什么区别???
  • 全局变量和静态局部变量有什么区别?
  • 静态变量 和 全局变量 有什么区别?
  • 在全局变量和全局静态变量有什么区别
  • vc中,成员变量和static静态变量有什么区别?
  • 全局变量和静态变量分别存储在什么地方的?
  • 静态的全局变量和非静态的全局变量有什么区别呀?
  • 非常简单的问题,静态变量和非静态变量有什么区别啊?
  • 全局变量、静态变量、局部变量各存在内存的什么区域呀

关键词

  • c++
  • 内存
  • 函数
  • 多线程
  • 面向对象
  • 静态
  • 变量
  • 数组
  • 程序
  • someclass

得分解答快速导航

  • 帖主:sunlu_eric
  • mccxj
  • zhousqy
  • mccxj
  • nicknide
  • foochow
  • whyglinux
  • megaboy
  • luckyrain
  • stkane
  • lucymary1982
  • jingyueid
  • zdy_8212
  • chenkong
  • stkane
  • stkane
  • stkane
  • july81
  • Non_miracle
  • stkane
  • visual4825

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo