多用静态变量有什么坏处?
如题!! 问题点数: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




