zoukankan      html  css  js  c++  java
  • 静态成员和方法的使用场合及利弊分析

    数据成员

    数据成员可以分静态变量、实例变量两种.
    静态成员:静态成员变量是和类相关联的,可以作为类中"共"有的变量(是一个共性的表现),他不依赖特定对象的存在,访问的时候通过类名加点操作符加变量名来访问.
    实例成员:实例成员变量是和对象相关联的,访问实例成员变量依赖于实例的存在.

    函数成员

    方法可以主要分为静态方法,实例方法
    静态方法:静态方法是不属于特定对象的方法,静态方法可以访问静态成员变量,静态方法不可以直接访问实例变量,可以在实例函数调用的情况下,实例变量做为参数传给静态方法。静态方法也不能直接调用实例方法,可以间接调用,首先要创建一个类的实例,然后通过这一特定对象来调用静态方法。
    实例方法:一个实例方法的执行与特定对象关联,他的执行需要一个对象存在。实例方法可以直接访问静态变量和实例变量,实例方法可以直接访问实例方法、和静态方法,静态方法的访问方式为类名加点操作符加变量名。当多个实例对象存在时,内存中并不是存在美个特定的实例方法的拷贝,而是,相同类的所有对象都共享每个实例方法的一个拷贝(实例方法只占用“一套”空间)。

    静态的东西,在构造的时候是在堆中生成,在结束前不会被释放与改变.
    大量的数据访问 由于已经生成且不被释放,所以就不会在栈中反复创建实例,节约空间时间。
    非静态的反复调用方法 有可能造成使用过的变量或方法被系统回收,而再创建的问题。
    对于大数据量的访问操作,应该使用静态方法,可以提高性能。
    如果一个方法不需要实例就能很好的运行,那它本来就该是静态的,除非是你故意把它写成非静态的,所以这个效率是无稽之谈。

    静态方法的使用场合

    一、该方法与任何实例无关。
    二、该方法与特定实例无关。
    三、该方法是运算符。
    四、该方法不修改实例。
    不过,除了第一条和第三条是亘古不变的之外,第二第四都是见仁见智的了。  

    关于静态方法

    1、static声明的变量和方法会被放到内存的堆区,即使不调用也会被分配空间,而非static情况只有在使用的时候才被分配空间,使用完就释放掉。
    2、static不需要你创建一个实例就可以调用。

    当一个类的成员被声明为static时,它可以在这个类的对象被创建之前且没有任何对象的引用存在时被访问。因此,static成员多数被用于全局目的。可以将方法和变量都声明为static。当载入一个类时,一个又一个static块只执行一次。也就是说一些比较通用在系统中应用的比较广泛的函数,一般是采用静态方法。而不太通用的函数则可以使用非静态方法,因为在系统中使用的不是很多,不象通用函数那么广泛。实例化反而比静态方法更适合一些,它实例化所消耗的资源就可能比静态方法消耗的资源要少一些。所以一般都是根据实际需求来决定是否采用静态方法。

    ===================================================

    用C#写程序,或者用一门oo语言写程序,你首先应该分清楚什么时候用静态函数,什么时候需要用成员函数。
    如果不加区分,抛弃了oo意义,只是为了少许的提升性能的话,那么我建议你别用c#了,用C写,你获得性能提高会更多,可以说不是一个数量级的。

    其次,就静态函数与静态成员的内存消耗、所带来的性能提高,以及由哪些危害,我大致提一下。
    对于内存消耗来说,一般看似只有静态成员会消耗,而静态函数不会。
    但是调用一个类的静态函数,类的静态成员如果没有初始化的话,是需要初始化的,也就是说静态函数的调用会对静态成员进行初始化,也就是潜移默化的造成内存损耗。
    对于性能提高而言,
    首先说说静态函数的调用,大致形式如下:
    类名.方法名
    调用步骤大致如下
    1、通过类名找到类型table
    2、通过类型table找到要调的函数指针,进行调用。
    而对于成员函数,大致形式如下:
    对象名.方法名
    调用步骤大致如下
    1、通过对象名找到类型table地址
    2、通过类型table地址找到类型table
    3、通过类型table找到要调的函数指针,进行调用。
    也就是说调用成员函数要比静态函数多调用一个步骤,这里可以说是成员函数的性能不如静态函数的地方。

    最后说说纯粹为了性能,而滥用静态函数的危害。
    就像我前面举例的那样,不要为了静态函数而用静态函数,而大量产生如下的形式
    public   class   UglyClass
    {
            public   static   void   UglyMethod(   UglyClass   data   );
    }
    再说危害之前,首先说说静态函数所能访问到的数据,大致有两种
    1、静态成员;
    2、参数;
    如果使用静态成员来传递数据的话,这你就要小心了,尤其是多线程的操作时候,操作不好的时候会产生相互干扰,而且这种问题你很难查出来。
    如果使用参数来作为传递数据的方法,
    首先参数列表显得臃肿,把本来不该传进的进行传递;
    其次参数的读写操作,和静态成员一样,多线程操作的时候,也会出现相互干扰。
    而这些在静态函数所产生的潜在危害,对于类的成员函数来说,可以最大的避免。
    好了,不在多说了,
    对于是否使用静态函数,还是那一点建议,即你首先区分什么函数应该用静态函数实现,什么函数不应该用它来实现。

  • 相关阅读:
    科学计算——笔记
    Python_scrapyRedis零散
    Python博文_爬虫工程师是干什么的
    [单选题]怎样打开或创建一个文件?
    [问答题] 写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):
    [单选题]<?php$age =18;$age?$age+10:$age+20;echo $age;?>
    [单选题]有关PHP面向对象的说法,不对的是:
    [单选题]要循环操作非顺序索引的数组时,可以用下面哪个函数来读取数组当面元素的索引值?
    [单选题]PHP中定义常量的方法是:
    [单选题]stdClass的一个对象如何设置成员value的值?
  • 原文地址:https://www.cnblogs.com/jes_shaw/p/3148629.html
Copyright © 2011-2022 走看看