精华内容
下载资源
问答
  • 淘淘商城静态资源文件包括css、js、jsp文件
  • C# 之 静态方法和非静态方法对比

    千次阅读 2019-03-29 22:15:55
    C# 静态方法和非静态方法简析, C# 静态方法和非静态方法的区别, C# 静态方法和非静态方法的内存占用误解

    C#静态成员

    静态成员属于类所有,为各个类的实例所公用,无论类创建了几多实例,类的静态成员在内存中只占同一块区域。

    1. 、静态成员属于类所有,非静态成员属于类的实例所有。
    2. 、每创建一个类的实例,都市在内存中为非静(动)态成员新分派一块存储;

    静态数据成员区别于动态数据成员,静态变量并不是稳定的,只是静态变量在声明的时候不管有没有赋值,都会凭据它的类型分派对应的内存空间,他的可访问性和作用区间与动态变量是一样的


    非静态类可以包含静态方法、字段、属性或事件。 即使未创建类的任何实例,也可对类调用静态成员。 静态成员始终按类名(而不是实例名称)进行访问。 静态成员只有一个副本存在(与创建的类的实例数有关)。 静态方法和属性无法在其包含类型中访问非静态字段和事件,它们无法访问任何对象的实例变量,除非在方法参数中显式传递它。
    更典型的做法是声明具有一些静态成员的非静态类(而不是将整个类都声明为静态)。 静态字段的两个常见用途是保留已实例化的对象数的计数,或是存储必须在所有实例间共享的值。
    静态方法可以进行重载,但不能进行替代,因为它们属于类,而不属于类的任何实例。
    虽然字段不能声明为 static const,不过 const 字段在其行为方面本质上是静态的。 它属于类型,而不属于类型的实例。 因此,可以使用用于静态字段的相同 ClassName.MemberName 表示法来访问常量字段。 无需进行对象实例化。



    通常我们调用方法的三种形式:

    	class Program
        {
            static void Main(string[] args)
            {
                //第一种方式, 声明实例,调用实例方法   
                ClassName someClass = new ClassName();
                ClassName.Method();
                //第二种方式,通过一个静态的实例,去调用实例方法   
                ClassName.instance.Method();
                //第三种方式,直接调用静态方法   
                ClassName.Method();
    	}
    }
    

    有时候我们对静态方法和实例化方法会有一些误解。

    下文参考链接:https://blog.csdn.net/BIAOBIAOqi/article/details/6732117

    1、大家都以为 “ 静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存。”

    要知道一个.NET类型的静态方法是属于这个.NET类型的。而这个.NET类型是一个.NET 程序集的一部分。这个.NET程序集是被一个AppDomain装入到内存里面来的。这个AppDomain是可以从内存卸载的。一个有.NET CLR的进程里面可以有多于一个的AppDomain,第一个AppDomain之后的AppDomain都可以动态创建和卸载。这些AppDomain中的.NET程序集,既可以有静态方法,也可以有实例方法。不管是静态方法还是实例方法,都是随其程序集所在的AppDomain一起创建和卸载。第一个AppDomain在整个程序运行结束时也会最后被卸载。其中所含的.NET程序集自然也卸载

    静态方法不存在常驻内存一说,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载。调用的速度基本上没有差别。

    2、大家都以为 “ 静态方法在堆上分配内存,实例方法在堆栈上”

    事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的。

    方法占不占用更多内存,和它是不是static没什么关系。
    因为字段是用来存储每个实例对象的信息的,所以字段会占有内存,并且因为每个实例对象的状态都不一致(至少不能认为它们是一致的),所以每个实例对象的所有字段都会在内存中有一分拷贝,也因为这样你才能用它们来区分你现在操作的是哪个对象。
    但方法不一样,不论有多少个实例对象,它的方法的代码都是一样的,所以只要有一份代码就够了。因此无论是static还是non-static的方法,都只存在一份代码,也就是只占用一份内存空间。
    同样的代码,为什么运行起来表现却不一样?这就依赖于方法所用的数据了。主要有两种数据来源,一种就是通过方法的参数传进来,另一种就是使用class的成员变量的值……

    3、大家都以为 “实例方法需要先创建实例才可以调用,比较麻烦,静态方法不用,比较简单”

    事实上如果一个方法与他所在类的实例对象无关,那么它就应该是静态的,而不应该把它写成实例方法。所以所有的实例方法都与实例有关,既然与实例有关,那么创建实例就是必然的步骤,没有麻烦简单一说。

    当然你完全可以把所有的实例方法都写成静态的,将实例作为参数传入即可,一般情况下可能不会出什么问题。

    从面向对象的角度上来说,在抉择使用实例化方法或静态方法时,应该根据是否该方法和实例化对象具有逻辑上的相关性,如果是就应该使用实例化对象 反之使用静态方法。这只是从面向对象角度上来说的。

    如果从线程安全、性能、兼容性上来看 也是选用实例化方法为宜。



    我们为什么要把方法区分为:静态方法和实例化方法 ?

    如果我们继续深入研究的话,就要脱离技术谈理论了。早期的结构化编程,几乎所有的方法都是“静态方法”,引入实例化方法概念是面向对象概念出现以后的事情了,区分静态方法和实例化方法不能单单从性能上去理解,创建c++,java,c#这样面向对象语言的大师引入实例化方法一定不是要解决什么性能、内存的问题,而是为了让开发更加模式化、面向对象化。这样说的话,静态方法和实例化方式的区分是为了解决模式的问题。

    展开全文
  • 整套企业网站html静态模板

    千次下载 热门讨论 2015-09-11 14:28:13
    非常漂亮的一整套企业网站静态html模板,你一定会喜欢。首页是index.html(好资源就是要分享)
  • 静态数据成员和静态成员函数

    万次阅读 多人点赞 2018-08-26 19:18:35
    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就...

    转载自:https://blog.csdn.net/computer_liuyun/article/details/29235111

    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就对静态数据成员和静态成员函数坐下小结哈!

    一、静态数据成员

    1.静态数据成员怎么去定义?

    在类中声明静态数据成员很简单,是以static关键字表明即可,如下所示

    class Test{
    private:
    	//静态数据成员
    	static int a;
    };
    

    a就是静态数据成员了,在类中只能声明可是不能定义哈!

    要对静态数据成员定义和初始化必须在类的外面也就是在全局作用域中定义,如果定义不给出初值,则默认初值为0

    class Test{
    public:
    	int GetA() const{return a;}
    private:
    	//静态数据成员
    	static int a;
    };
    //int Test::a;如果这样定义不赋予初值则初值为零
    int Test::a = 1;
    #include <iostream>
    int main()
    {
    	Test T;
    	std::cout << T.GetA() << std::endl;
    }
    

    定义时一定要在全局作用域中定义,一定不要在类中定义!

    静态数据成员甚至在类没有任何对象的时候都可以访问,静态成员可以独立访问,无需依赖任何对象的建立

    另外,不要试图在头文件中定义(初始化)静态数据成员。在大多数的情况下,这样做会引起重复定义这样的错误。即使加上#ifndef #define #endif或者#pragma once也不行。

     

    2.静态数据成员被类的所有对象共享,包括该类的派生类对象,基类对象和派生类对象共享基类的静态数据成员

    答:静态数据成员不属于任何对象,类的静态数据成员的存在不依赖于任何类对象的存在,静态数据成员是由类的所有对象共享的。例子如下:

    class Base{
    public:
    	//静态数据成员
    	static int a;
    };
    class Derived : public Base{
     
    };
    //int Test::a;如果这样定义不赋予初值则初值为零
    int Base::a;
    #include <iostream>
    int main()
    {
    	Base B;
    	Derived D;
    	B.a++;
    	std::cout << B.a << std::endl;
    	D.a++;
    	std::cout << D.a << std::endl;
    	
    }
    

    打印结果如下:

    由打印结果看出来,派生类对象和基类对象都是共享基类的静态数据成员,而基类的所有对象也是共享该静态数据成员,且该静态数据成员应该在全局作用域中定义,可以赋予初值也可以不赋予初值,如果不赋予初值,静态数据成员有其默认值。

     

    3.静态数据成员可以作为成员函数的默认形参,而普通数据成员则不可以

    答:不多说,直接看例子马上就明白了哈!

    class Test{
    public:
    	//静态数据成员
    	static int a;
    	int b;
    	void fun_1(int i = a);//正确
    	void fun_2(int i = b);//报错
    };
    

    4.静态数据成员的类型可以是所属类的类型,而普通数据成员则不可以。普通数据成员的只能声明为 所属类类型的 指针或引用

    答:这个也不多说,直接看例子就可以懂什么意思哈!

    class Test{
    public:
    	//静态数据成员
    	static Test a;//正确
    	Test b;//报错
    	Test *pTest;//正确
    	Test &m_Test;//正确
    	static Test *pStaticObject;//正确
    };
    

    5.静态数据成员在const函数中可以修改,而普通的数据成员是万万不能修改的哈!

    答:看个例子

    class Test{
    public:
    	Test():b(0){}
    	//静态数据成员
    	static int a;//正确
    	int b;
    	void test() const
    	{
    		a++;
    		b++;//const指的不能修改当前调用该函数对象的数据成员
    	}
    };
    int Test::a;
    

    const修饰的时当前this指针所指向的对象是const,但是静态数据成员不属于任何类的对象,它被类的所有对象修改,所以this指针不修饰静态的数据成员,所以可以更改。

     

    二、静态成员函数

    静态成员函数的声明也很简单,就是在类的成员函数前加上static关键字即可,和静态成员一样,静态成员函数也是属于类的,它并不属于任何对象,当调用静态成员函数时应该使用类名和域运算符“∷”,当然也可以使用对象调用操作,但是这样的操作并不意味着静态成员函数属于这个对象,它只是被这个对象共享而已,这样也就决定了静态成员函数中是不能访问本类中的非静态数据成员的,它是不能访问非静态数据成员的,在c++中静态成员函数主要用来访问静态数据成员而不访问非静态数据成员

    1.静态成员函数不能调用非静态成员函数,但是反过来是可以的

    2.静态成员函数没有this指针,也就是说静态成员函数不能使用修饰符(也就是函数后面的const关键字)

    3.静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。

    总结:其实声明为静态,不论是静态数据成员还是静态成员函数,它们都是不依赖于对象而存在的,类在定义后并不分配存储空间,而是在定义类的对象的时候才分配存储空间,相反静态的数据成员和静态的成员函数是已经在内存中开辟了内存空间了,所以静态数据成员可以独立的访问在任何类对象没有建立起来都可以访问,并且静态成员函数不可以调用非静态成员函数,因为非静态成员函数只有在类对象建立以后才可以调用,相反则是可以的。我觉得当对某个判断产生怀疑的时候应该去测试,只有验证了才知道是不是对的哈!

    为了能更好阐释静态数据成员和静态成员函数,然后在网上搜了博客,感觉有些例子不错(因找不到最初的出处,所以无法注明请原作者谅解),所以就拿来给大家参考一下哈!

    关于玩篮球的例子很能明显解释静态数据成员和静态成员函数到底是怎么回事

    你们班里面有10个人(10个比如高一一班的对象),体育老师分给你们一个篮球(静态成员函数),你们每个人都带了一个篮球(非静态成员数),你们都很小气,自己的球只能自己拍,要是5对5打比赛,那就只能用那个静态的篮球了(每个人都可以拿来用,但是带来的影响是对全体的)。因此,我可以说那个篮球是高一一班的成员。所以也就是说:静态成员函数是类的成员函数(因为高一二班就不能拿来玩),但是这个篮球最后还是要还给老师的,任何私人不得占有。希望这样你能明白,其实在内存空间里面说白了静态的成员的内存是唯一的一份,就是当你在类外声明他时开辟的,但是非静态函数的空间分配是在你实例化对象时创建的。

    为了使大家更好的理解这两个概念,还是老样子用代码来说明上面文字说明的这一切哈!

    关于学生类的例子

    //定义Student类
    #include <iostream>
    class Student                  
    {
    public:
    //定义构造函数
    Student(int n,int a,float s):num(n),age(a),score(s){ }      
    void total();
    //声明静态成员函数
    static float average();      
    private:
    	int num;
    	int age;
    	float score;
    	//静态数据成员,累计学生的总分
    	static float sum; 
    	//静态数据成员,累计学生的人数
    	static int count;           
    };
    //在全局作用域对静态数据成员初始化,如果不赋予初值,则使用其默认值零
    float Student::sum;                     
    int Student::count;
    //定义非静态成员函数
    void Student::total()                    
    {
    	//累加总分
    	sum+=score;
    	//累计已统计的人数
    	count++;                               
    }
    //定义静态成员函数
    float  Student::average()                  
    {
    	return(sum/count);
    }
    int main()
    {
    	Student stud[3]={    
    	//定义对象数组并初始化
    	Student(1001,18,70),
    	Student(1002,19,78),
    	Student(1005,20,98)
    };
    int n;
    std::cout<<"please input the number of students: ";
     //输入需要求前面多少名学生的平均成绩
    std::cin>>n;                              
    //调用3次total函数
    for(int i=0;i<n;i++)
    {
    	stud[i].total();
    }
    //调用静态成员函数
    std::cout<<"the average score of "<<n<<" students is "<<Student::average( )<<std::endl;
    return 0;
    }
    

    打印输出如下:

     

    对上面的代码做以下说明:

    首先,在主函数中定义了对象数组,存放每个学生的编号、年龄和成绩,其中sum和count是要累计所有学生的总成绩和总的学生人数,我们定义成了静态数据成员,在学生类的成员函数中,我们定义了普通的total成员函数,用来计算所有学生的总成绩和总的学生人数,另外,定义了静态成员函数average,学生类的设计大概如此

    在全局作用域对类中静态数据成员进行了定义,但未赋予初值,这意味着我们采用其默认值。

    在类的普通成员函数toal中可以引用静态数据成员sum和count,可见类的所有成员函数都可以引用类的静态数据成员。

    在类的静态成员函数average中,只能引用类的静态数据成员,不能引用非静态数据成员。

    在主函数中我们调用类的非静态成员函数时只能通过类对象来调用,如stu[i].total,但是对于静态成员函数可以直接通过类名+作用域符号来调用,如

    Student::average。

     

    展开全文
  • 网站静态化——伪静态&SEO

    千次阅读 2019-01-06 21:57:27
    #什么是伪静态,伪静态作用   伪静态即是网站本身是动态网页如.php 、.asp 、 .aspx 等格式动态网页。有时这类动态网页还跟“?”加参数来读取数据库内不同资料。很典型的案例即是discuz论坛系统,后台就有一个设置...

    什么是伪静态,伪静态作用

      伪静态即是网站本身是动态网页如.php 、.asp 、 .aspx 等格式动态网页。有时这类动态网页还跟“?”加参数来读取数据库内不同资料。很典型的案例即是discuz论坛系统,后台就有一个设置伪静态功能,开启伪静态后,动态网页即被转换重写成静态网页类型页面,通过浏览器访问地址和真的静态页面没区别。前提服务器支持伪静态重写URL Rewrite 功能。

    需要伪静态功能地方

      考虑搜索引擎优化SEO ,将动态网页通过服务器处理成静态页面,如www.w3cschool.cn/php?=php-json这样的动态网页处理成www.w3cschool.cn/php/php-json.html 这样格式静态页面,常见的论坛帖子页面,都是经过伪静态处理成静态页面格式html 页面。考虑网站所用的程序语言不易被发现,经过重写来伪静态来将动态网页的程序后缀变为html的静态页面格式。

    伪静态的利与弊

      当然犹如一篇文章的作者所说的:"如果流量稍大一些使用伪静态就出现CPU使用超负荷,我的同时在线300多人就挂了,而不使用伪静态的时候同时在线超500人都不挂,我的IIS数是1000。”确实是这样的,由于伪静态是用正则判断而不是真实地址,分辨到底显示哪个页面的责任也由直接指定转由CPU来判断了,所以CPU占有量的上升,确实是伪静态最大的弊病。

    我们应该选择伪静态还是真静态?

    • 使用真静态和假静态对SEO来说没有什么区别
    • 使用真静态可能将导致硬盘损坏并将影响论坛性能
    • 使用伪静态将占用一定量的CPU占有率,大量使用将导致CPU超负荷

    针对SEO的静态化方案选择:

    最重要的一点,如果我们要静态是为了SEO所以:
    
    • 使用真静态的方法可以直接排除了,因为无论怎么生成,对硬盘来说都是很伤的。
    • 既然真伪静态的效果一样,我们就可以选择伪静态了。
    • 但是伪静态大量使用会造成CPU超负荷。
    • 所以我们只要不大量使用就可以了。

    既然静态只是给SEO看的,我们只需要伪静态给SEO就行了,不需要给用户使用。针对Discuz论坛,所以我们只要在专门提供给SEO爬的Archiver中使用伪静态就可以了

    关于伪静态和真静态的评论

      真正的静态化和伪静态还是有本质的区别的。为浏览用户处理一个纯粹htm和一个调用多个数据的php在CPU的使用率方面明显前者少。记得原来有个人说html下载硬盘读写频繁,他这么说好像读取数据库不用读写磁盘似的,何况还有一大堆缓存的零散php 也是放在硬盘的,这些读取不用磁盘操作么?可笑。读取单个htm+图片Flash等附件就可以实现的目的,何苦要读数据库又要读php缓存文件又要重新整合数据输出再+图片Flash等附件这么大费周章呢?CMS首页不需要很多的互动的,论坛那一套不应该拿到这里来用,相反应该更多考虑的是:美观!兼容!信息的直观!性能!还有稳定!伪静态查考-Apache与IIS伪静态设置方法具体伪静态实现可以根据自己所用的语言写的网站去百度或谷歌搜索实现方法 。

    SEO

    动态页面

      我们经常会看到 , 在地址栏里有一些网址特别长,而且还带有 “?”, 这样的链接一般是动态链接,其所对应的页面就是动态页面 。
    在技术上,动态页面具有这些特征:
    1 ,动态页面是以 ASP 、 PHP 、 JSP 、 ASP.net 、 Perl 、或 CGI 等编程语言制作的;
    2 ,动态页面实际上并不是独立存在于服务器上的网页文件,只有当用户请求时服务器才返回一个完整的网页;
    3 ,动态页面上的内容存在于数据库中,根据用户发出的不同请求,其提供个性化的网页内容;
    4 ,动态页面内容不是存在于页面上,而是在数据库中,从而大大降低网站维护的工作量;
    5 ,采用动态网页技术的网站可以实现更多的功能,如用户注册、用户登录、在线调查、用户管理、订单管理等等; 静态页面 则无法实现这些功能。
    SEO 的角度,动态页面有这些弊端:
    1 ,由于动态页面的生成是采用数据库的内容,所以网页内容主题的永恒性不能保证。这样造成了搜索引擎的阅读困难,即搜索引擎抓不住一个永恒的主题,因此不能输入到搜索引擎中的缓存( cache )中。
    2 ,动态网址里往往包含 “ ? ” 和很多参数,这让目前技术条件下的搜索引擎在判断和识别造成了很大的困难。
    3 ,动态链接,存在一个信任问题,用户以及搜索引擎都无法确定这个页面会一直存在。
    搜索引擎对于静态链接更友好,所以,把动态网址进行 URL 重写优化 使其静态化,是一个非常重要的 SEO 技巧。 SEO 十万个为什么是全站动态的,目前这么合理和简洁规范的 URL 就是经过 URL 重写( URL-rewrite )技术处理的。

    动态页面和静态页面的 seo 优缺点

      网页的 url 地址可以分为动态和静态,动态页面并非实际存在于服务器当中,根据用户发出的请求提供相应的内容,对服务器运作来说压力较小,静态页面的地址是真实存在的,路径当中不含有? &% 之类的变量符号,所以对搜索引擎来说更友好更容易得到信任,为了追求动态页面和静态页面的优点又回避缺点产生了 “ 伪静态 ” ,在动态页面的基础上通过 url 重写技术把转移参数插入到 url 地址中达到迷惑蜘蛛的作用。

      那么看似百利而无一害的伪静态页面是否就是最好的呢?结合动态页面和静态页面的优缺点对比看看。

    动态页面

      在服务器端运行的程序组件和网页都属于动态网页,根据用户的要求返回页面,交互性很好,但是存在着很大的安全隐患,动态网站页面的信息必须从数据库中读取, 每打开一个页面造成一次读取命令,如果人数过多会增加服务器的工作量,从而影响这个网站的运行速度,动态网站的变量链接很容易造成死循环,使蜘蛛深陷其中,所以对搜索引擎很不友好。

    静态页面

    静态页面实际存在于服务器内,无需经过编译就能直接加载到用户浏览器上显示出来,中间省略的脚本计算和读取数据库提高了访问的速度,缺点同样并存与优点之中,由于静态页面存放在服务器中药占据空间内存,可以想象如果某论坛有 10 万帖,每个帖的大小 100K ,如果全部作为静态页面存在于服务器中就要占据 10G 的大小,不包括存储计算中造成的空间浪费,所以相当消耗空间资源。

    伪静态页面

      那么伪静态页面是否就能结合动态页面和静态页面的优点,既能解决搜索引擎友好的问题,又能解决静态页面空间资源消耗大的问题几乎完美的存在,其实不然,浏览器访问伪静态页面时是通过正则判断,而这个分辨的过程由 cpu 完成,导致 cpu 使用率上升出现超负荷,影响网站的正常服务就是伪静态的最大弊病

      由此可以看出每种形式都是有长有短的,怎么合理的使用各种形式完全取决于站长对网站规模的计划和类型的定位。

      伪静态还有的2点好处:1)防止某些黑客恶意攻击。有些大网站采用不同的技术开发不同功能的页面。而把拓展名改掉,让黑客无法确认此页面用的技术是什么,从而就无从下手。 2) 方便访问者使用。访问者不是程序员,他们不明白什么是.jsp,.php.aspx,他们只知道URL。所以统一把拓展名拿掉,或者统一把拓展名换为html,htm,有利于用户的使用。用户可以知道现在在你网站的位置,如何通过输入URL到某一页面。

    针对 seo 优化动态网页如何优化

    动态生成的网页:

      对于那些动态生成网页,我们这些实际的访问者可以通过肉眼看到。但对于大多数搜索引擎的蜘蛛程序却往往是不可见的,这也就是动态网页很难被搜索引擎的 SPIDER 检索的原因。因而,要想让你的动态网页能够出现在搜索引擎的搜索结果中,只要保证你的网站内容对搜索引擎是可见的,即搜索引擎的 Spider 程序能够看到你网站的内容就可以了 .

      所谓动态网页一般指的是采用 ASP , PHP , ColdFusion , CGI 等程序动态生成的页面,该网页中的大部分内容来自与网站相连的数据库。在网络空间中并不存在这个页面,只有接到用户的访问要求后才生成并传输到用户的浏览器中。而且由于访问者能够实时得到他们想要的数据,动态网页往往容易给人留下深刻的印象。此外,动态网页还具有容易维护和更新 的优点。例如,对于一个新产品或价格的调整。网站管理员只要对数据库做一下简单的改动就可以了,根本不需要去修改每个单独的静态页面。

      我们可以看出,从用户角度来考虑,动态网页确实非常棒。但如果在搜索引擎的角度来看,结论却不同了。

    动态网页的问题所在 :

      问题就出在这些动态网页在网络空间中并不是实际存在的,只有当用户在变量区中输入一个值以后它们才会生成 。而我们大家也都知道,搜索引擎的 Spider 再聪明,它也只是一个搜索程序,它们无法象真正的人那样选择变量并输入数值。亦可将查询编入主页上的一个链接中,使得该链接成为一个预先定义的网站目录的查询。用户可在一个搜索表格中键入查询条件来查询,通常动态脚本需要某些信息来返回页面内容,最常见的如 Cookie 数据, SessionID 或一个环境变量。但对搜索引擎的 Spider 程序来说,它们压根不可能知道去使用你的搜索功能,或者该问什么问题。就是因为如此, Spider 对网站的检索往往会在一个动态站点前不得不止步。此外,在动态页的 URL 中包含了问号 (?) 和百分号 (%) 。还有一些符号诸如 & , % , + 和 $ 等在一个动态页的 URL 中也经常能看到。这样的 URL 被称作“环境变量” (querystring) 。不过大多数 SPIDER 都无法解读符号“ ? ”后的字符 。很显然,由于这个 URL 并不实际存在,所以它们一无所获。因此,如果你的整个网站或网站上有大部分网页都是采用动态来生成的,为了使 SPIDER 易于读取你网站上的内容,你需要对网站做一定的修改。还有一些搜索引擎在对页面进行检索时往往也会拒绝对 cgi-bin 目录下的静态页面 ( 即被保存成静态页面的动态页 )URL 进行检索 。

    搜索引擎为何不读取符号“ ? ”后的内容:

      搜索引擎的 SPIDER 不愿意读取放在 cgi-bin 目录下的网页,或是 URL 中包含了符号“ ? ”的字符。其原因就在于,如果在 CGI 中提供了“无穷”数量的 URL ,那么 SPIDER 往往就会因为对这些“无穷”网页的检索而被牢牢套住,陷入死循环。这就是所谓的蜘蛛陷阱 (spidertraps) 。数据库程序对 SPIDER 亦有可能创建一个与此类似的情形。因而为避开可能的陷阱, Spider 对于那些带有符号“ ? ”的 URL 中的“ ? ”之后的字符一概不予读取。倘若 Spider 被你的服务器套住,不只是对 Spider 本身不妙, Spider 对你网站页面的重复访问请求也会导致你的服务器系统彻底瘫痪。

    动态链接的静态化

    动态链接的静态化:

      动态页面的链接是动态产生的,在返回页面内容之前,动态脚本需要一些信息,如 cookie data 、 session id 或字符串。动态页面是基于数据库驱动的,通过脚本语言动态产生的页面。动态网站中有模板,内容一般存放于数据库中。要浏览页面时,模板调用数据库中的内容,参数被添加到 URL 上 , 这种复合型 URL 告诉了模板要装载的具体内容。浏览者在动态网站中通过使用查询字符串发现信息,这种查询字符串被键入表单中或被预先编码在主页上的链接中。

      蜘蛛不清楚如何使用查询功能,若蜘蛛用没有查询字符串的不完整请求向服务器提交,服务器会要求信息完整地址,这是蜘蛛不能理解的,从而可能陷入了一种死循环 中。搜索引擎难以处理动态网站,因不能提供产生页面需要的信息,会陷入到动态页面服务器中而不能自拔,蜘蛛和服务器陷入无限循环之中,会导致服务器瘫痪。因此,动态网页内容对大多数搜索引擎蜘蛛是不可见的,大多数蜘蛛反感动态页面,在识别出这种 URL 后,会敬而远之。不会检索它。因此需要把这些有价值的内容转换成随蜘蛛可见的形态。

      这种复合型 URLs 是搜索引擎难以检索的,因搜索引擎不知道定义内容的参数。参数越多,越难以被检索到。为此,需要克服这种不完整地址问题。有两种解决方案:

      搜索引擎友好的动态页面,修改 URLs ,参数越少越好,最好把页面静态化。

    伪静态页面生成方法示例:

    在文章列表中把文章的连接如/blog/articleInfo.do?userName=zy&&blogId=1&&articleId=1转换成blog/a/0101002526B90C548A833416.html这种URL,这样蜘蛛就可以进而爬进去看相应的内容了,因为文章列表中的每一篇文章都是不同的静态URL。

    静态与伪静态的比较:

    第一、速度,对于速度而说,静态页面比伪静态好,因为静态页面是实实在在存在于服务器上的页面。在用户向服务器发出请求时,可以直接直接调用。然而伪静态,其实是一个动态页面,只是用一个技术或手段,将动态页面中的“?”等一些符号用蜘蛛可以很内容识别出来的字母给代替了。所以像这种静态页面,要向服务器发出请求时,还要多出一个功能就是转化功能,如何同时请求过多,会加大服务器的负荷。
    第二、容量,对于容量而言,因为静态页面是实实在在存在于服务器中,因此会占用一定的空间,如何文件过多,占用的空间就多。然而伪静态就可以避免这一点,因为伪静态是将动态的URL给转换成静态,实际在服务器上是不存在的。
    第三、搜索引擎友好性。对于静态URL页面,实实在在存在于服务器上,当搜索引擎收录之后,URL是不会改变的,哪有用户访问时,也不会出问题。然而如果是伪静态页面,服务器伪静态组件不出问题,这个URL就没有问题,如何伪静态组件出问题了,哪么当搜索引擎收录这个URL就会出错,如果出现错误过多,会让搜索引擎讨厌你网站,所以在试用伪静态页面时,伪静态组件,一定不要出错。

    内容源自:
    http://www.divcss5.com/html/h63.shtml
    https://zy116494718.iteye.com/blog/1685127

    展开全文
  • c/c++静态变量和静态函数

    千次阅读 2018-11-11 15:32:26
    而内存主要分为两类:静态存储区和动态存储区; 静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。 ...

    c语言中

    c语言中需要内存来存放数据。而内存主要分为两类:静态存储区和动态存储区;

    1. 静态存储区分为:只读数据(READONLY DATA)区、以读写数据(RW DATA)区、未初始化区(BSS)。它们都是在程序编译连接阶段确定的,在程序执行的阶段不会改变。

    2. 动态存储区分为堆和栈。都是程序执行的过程中动态分配的,大小也随之动态变化。从内存管理的实现的角度看来,堆使用的链表实现的,而栈使用的是线性存储的方法。

    :栈是先进后出,实际的操作中,栈内存可以有满栈和空栈的情况,满栈的情况下,栈指针当前的位子是已经使用的的栈区域;空栈的情况是,栈指针当前的位子是没有使用的栈区域,所以两种情况的出入栈,指针和数据的操作先后顺序是不同的。

    • 满栈时:入栈,是先移动指针,在放入数据;出栈则是先出数据,在移动指针;
    • 空栈时:入栈,是先放入数据,在移动指针。出栈则是先移动指针,在出数据;

    C语言必须注意的几个问题:

    1. 内存泄露:申请一块内存,但没有释放,程序结束也没回收,导致其他程序不能使用
    2. 野指针:指一个内存指针已经被释放free或者realloc,但指针依然在使用。避免野指针的情况,将内存的指针置为NULL,并在程序使用的时候判断该内存是否为NULL,如为空,则认为该内存已经释放,不对内存进行访问。
    3. 非法释放内存:原则上讲只有被malloc(),calloc()或realloc()分配并通过返回值返回返回的内存才能被释放,否则释放除此以外的内存都是非法的。即使有一个指针是*p是malloc,那么对p1=p++,这个时候free(p1)也是不合法的,但free( p) 确实可以的。同样释放函数中的局部变量也是非法的.还有一种情况是,对一个堆内存释放两次也是错误的用法。因为free()函数是不能释放未分配的堆内存。在程序使用free释放内存之后,应该将指针置为NULL,free一个NULL地址是没有问题的。

    c中:

    • 在介绍之前,先讨论一下 堆,栈,自由存储区,全局/静态存储区和常量存储区
    1. 堆:用new分配,free释放
      自由存储区:malloc分配,delete释放
    2. 栈:编译器管理的局部变量和函数参数等。
      全局/静态存储区:存储静态变量和全局变量
    3. 字符常量区:常量存储的内存

    也就是说static修饰函数的仅有一个意思:就是告诉编译器,我是一个内部函数,不要随便的用我。

    1. static 变量
      静态变量的类型 说明符是static。 静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量。 例如外部变量虽属于静态 存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。

    2. 静态局部变量
      静态局部变量属于静态存储方式,它具有以下特点:

      • 静态局部变量在函数内定义 它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

      • 允许对构造类静态局部量赋初值 例如数组,若未赋以初值,则由系统自动赋以0值。

      • 对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以 看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的 值。 因此,当多次调用一个函数且要求在调用之间保留某些变量的值时,可考虑采用静态局部变量。虽然用全局变量也可以达到上述目的,但全局变量有时会造成 意外的副作用,因此仍以采用局部静态变量为宜。

    3. 静态全局变量
      全局变量(外部变量)的说明之前再冠以static 就构 成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局 变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在 定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此 可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量 后是改变了它的作用域, 限制了它的使用范围。因此static 这个说明符在不同的地方所起的作用是不同的。

    4. static 函数……
      内部函数和外部函数:当一个源程序由多个源文件组成时,C语言根据函数能否被其它源文件中的函数调用,将函数分为内部函数和外部函数。

      • 内部函数(又称静态函数)
        如果在一个源文件中定义的函数,只能被本文件中的函数调用,而不能被同一程序其它文件中的函数调用,这种函数称为内部函数。定义一个内部函数,只需在函数类型前再加一个“static”关键字即可,如下所示:
        static  函数类型  函数名(函数参数表)
              {……}
    

    关键字“static”,译成中文就是“静态的”,所以内部函数又称静态函数。但此处“static”的含义不是指存储方式,而是指对函数的作用域仅局限于本文件。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系。

    1. 外部函数
        外部函数的定义:在定义函数时,如果没有加关键字“static”,或冠以关键字“extern”,表示此函数是外部函数:
          [extern] 函数类型 函数名(函数参数表)
            {……}
      调用外部函数时,需要对其进行说明:
      [extern] 函数类型 函数名(参数类型表)[,函数名2(参数类型表2)……];

    [案例]外部函数应用。
    (1)文件main.c

     main()
       {  extern void input(…),process(…),output(…);
    
        input(…);  process(…);  output(…);
    
        }
    
    

    (2)文件subf1.c

     extern  void input(……)                           /*定义外部函数*/
      {……}
    

    (3)文件subf2.c

      ……
      extern  void process(……)                     /*定义外部 函数*/
      {……}
    

    (4)文件subf3.c

      ……
      extern void output(……)                        /*定义外部函数*/
      {……}
    

    C++中的静态成员变量和静态成员函数

    1. 类静态数据成员在编译时创建并初始化:在该类的任何对象建立之前就存在,不属于任何对象,而非静态类成员变量则是属于对象所有的。类静态数据成员只有一个拷贝,为所有此类的对象所共享。特别需要注意的一点是:静态数据成员不能在类中初始化(对于常量静态类变量有待考证,好像可以在类外或main()函数之前定义,初始化可以放在类中),一般在类外和main()函数之前初始化,缺省时初始化为0。静态数据成员用来定义类的各个对象所公有的数据,比全局变量更安全。

    2. 类静态成员函数属于整个类,不属于某个对象,由该类所有对象共享。静态成员可定义为inline函数。一般情况下静态成员函数用于访问同一类中的静态数据成员或全局变量,而不访问非静态成员,如需访问非静态成员,需要将对象作为参数,通过对象名访问该对象的非静态成员。静态成员函数也可以在类外定义,此时不可以用static修饰。静态成员函数存在的原因是什么呢?主要是在建立任何对象之前可用它来访问静态数据成员,普通函数不能实现此功能。

    C++静态成员和静态成员函数的使用:静态成员的调用格式:类名::静态数据成员名、对象名.静态数据成员名、对象指针->静态数据成员、对象引用.静态数据成员(但类中很少会出现公有数据成员,这段仅仅讨论语法,未考虑实际运用中的数据封装问题)。静态成员函数的调用格式:类名::静态成员函数名、对象名.静态成员函数名、对象指针->静态成员函数名、对象引用.静态数据成员。静态成员函数没有this指针,因它不与特定对象相联系,调用时推荐使用“类名::静态成员函数名”格式。总结来说,在有对象的情况下,可以用调用普通类成员函数、普通成员变量的方式调用静态成员函数和静态成员变量。从这里可以看出静态成员变量和静态成员函数的使用应该是在不建立任何对象的情况下调用它们。其应用可以参见设计模式中Singleton pattern。

    展开全文
  • 学生信息管理系统模板(静态页面)

    千次下载 热门讨论 2015-03-18 14:57:56
    一个很好的学生信息管理系统模板(静态页面)非常好的一个资源 是一个模板,可以自己改为自己想要的页面、功能 内容如下: 个人中心 --我的信息 --班级信息 --短信息 --学院通知 教务中心 --我的报考 --我的成绩 --...
  • 静态路由配置

    万次阅读 多人点赞 2018-11-23 03:37:57
    静态路由配置 配置指令 路由设置 (config)# ip route 目标网段掩码 下一跳ip地址 例如路由A设置:#ip route 192.168.30.0 255.255.255.0 192.168.20.2 ①路由A设置f0/1(10.0网段)设置网关 f0/0接口设置ip地址192....
  • 静态链表详解(C语言版)

    千次阅读 多人点赞 2020-09-29 23:03:37
    你认识静态链表吗?听起来是不是很陌生呢?本文将较为详细的向你介绍它,感兴趣的话就一起来看看吧。
  • C++类中静态变量和静态方法使用介绍

    万次阅读 多人点赞 2018-08-14 10:45:26
    刷剑指offer第64题涉及到类内静态成员与方法的知识,有点模糊,找了两篇博客整理一下。 转自:https://www.cnblogs.com/sixue/p/3997324.html  最近一直看c++相关的项目,但总是会被c++类中的静态成员变量与...
  • Static静态代码块以及各代码块之间的执行顺序

    万次阅读 多人点赞 2019-10-16 19:56:49
    文章目录代码块的分类1、静态代码块(也叫静态块、静态初始化块)2、构造代码块(也叫构造初始化块)3、代码块(又叫普通代码块、初始化块)执行顺序的代码测试继承中各代码块的执行顺序 代码块的分类 基本上代码...
  • 静态库动态库区别 2. 库的版本 3. iOS 设备的CPU架构 4. ARM处理器指令集 5. i386|x86_64 指令集 6. Xcode中指令集相关选项 二、打包framewor静态库 1. 创建项目-》创建静态库项目 2. 静态库如何开发调试?...
  • 旅游类网站整套网站模板,html静态页面,电子商务类网站Html页面源码,旅游网站html完整页面.rar,在线旅游网站
  • 静态网页作品-精美个人主页源代码

    千次下载 热门讨论 2011-09-25 20:56:40
    针对很多人为了交作业在网上找静态网页作业,帮一个学生做的个人网页,经过美化修改,第一次发出来供初学者学习参考。 包含6个独立页面,分别为首页index.html、about.html、flash.html、message.html、photo.html、...
  • 静态变量与静态函数

    千次阅读 2018-08-16 10:42:50
    堆与栈 ...3、全局区(static):全局变量和静态变量的存储,有系统释放; 4、文字常量区:常量字符串存放,系统释放; 5、程序代码区:存放函数体的二进制代码。 堆与栈的区别: 1.栈内存存...
  • :我们知道,静态方法只能使用静态的全局变量,不能使用非静态的全局变量,如果在静态方法中使用了静态的全局变量,而这个静态变量又持有经静态方法传入的参数对象的引用,就有可能引起内存泄漏。 说到底都是静态...
  • mockito 静态方法Mockito allows us to create mock objects. Since static method belongs to the class, there is no way in Mockito to mock static methods. However, we can use PowerMock along with Mockito ...
  • 静态路由特点及其配置

    千次阅读 2018-09-09 19:08:13
    其实这是因为他们根本没有深入理解静态路由的工作原理,对于仅有一条静态路由配置命令中的各参数和选项的含义和使用方法也是一知半解,结果造成的是遇到一些静态路由故障时无法进行分析,而对于一些静态路由配置也...
  • 静态数据成员和静态数据成员函数

    千次阅读 多人点赞 2016-12-27 15:25:29
    c++中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西,好像也是找工作公司面试中常常问到的东西。我自己也深有体会,在学习c++的过程中,总感觉static很烦人,但是又是一个必须懂的东西,所以今天就...
  • Java 静态方法与非静态方法的调用

    千次阅读 2019-05-28 17:35:41
    调用静态方法 一般格式如下 类名.方法() //应为静态方法属于类本身,在同一个类中可以直接 调用 方法() 调用非静态方法 格式 对象名.方法() 一个小demo 方便理解 package me; public class Book { public void...
  • 静态网站模板 div+css 简单静态网站

    热门讨论 2010-06-02 16:24:19
    静态网站模板用div+css做的简单静态网站 这个是最近新的 下载地址:http://download.csdn.net/source/3461634 此为静态模板,含时间(农历)显示,二级下拉弹出菜单,幻灯片播放,栏目导航切换,视频播放,图片无缝...
  • 96个HTML静态网站模板打包

    热门讨论 2012-11-15 16:44:22
    26M 一共96个纯HTML网站模板 代码组成HTML+CSS+JS
  • 华为静态路由配置

    万次阅读 多人点赞 2019-11-12 09:11:59
    静态路由 静态路由是由管理员手动配置和管理的路由,静态路由配置简单,因此,被广泛应用于结构简单网络中,静态路由还可以实现负载均衡与路由备份。 拓扑 PC1位于192.168.1.0网段,它的IP是192.168.1.2,网关...
  • 实现页面静态化,PHP是如何实现的?

    千次阅读 2019-05-29 17:17:53
    随着网站的内容的增多和用户访问量的增多,无可避免的是网站加载会越来越慢,受限于带宽和服务器同一时间的请求次数的限制,...现在很多网站在建设的时候都要进行静态化的处理,为什么网站要进行静态化处理呢?我们...
  • 静态变量

    千次阅读 2021-01-16 11:05:47
    什么是静态变量 1)静态变量就是被static修饰的变量 (如 static int a) 2)静态方法就就是被static修饰的方法(如 public static void fangFa(){ }) 关于静态的注意事项 1)定义静态的变量----成员位置----成员...
  • static 静态变量和静态代码块的执行顺序

    万次阅读 多人点赞 2018-05-24 18:33:45
    众所周知 在android中static 修饰的会被称之为 静态常量,静态变量, 静态方法 ,还有就是静态代码块,用static{ // 代码块 非static修饰的方法,变量,常量, 是不能再静态代码块中使用的 } 表示。 static修饰...
  • 网工必备静态路由优先级

    千次阅读 2021-04-09 10:47:55
    [Huawei]undo ip route-static 192.168.2.0 24 192.168.3.2 //删除先前的静态路由(可以在最开始配置静态条目的时候直接配置优先级) [Huawei]ip route-static 192.168.2.0 24 192.168.3.2 preference ...
  • Java之静态成员

    千次阅读 2018-12-29 16:12:34
    静态成员最主要的特点是它不属于任何一个类的对象,它不保存在任意一个对象的内存空间中,而是保存在类的公共区域中,所以任何一个对象都可以直接访问该类的静态成员,都能获得相同的数据值,修改时,也在类的公共.....
  • static静态变量的理解

    千次阅读 2018-07-22 17:26:37
    static静态变量的理解 静态变量 类型说明符是static。静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存
  • C语言静态变量和静态函数(转)

    千次阅读 2019-06-13 10:05:22
    全局 全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。但是他们的作用域,非静态全局 变量的作用域是整个源程序(多个源文件可以共同使用); 而静态全局变量则限制了其作用域, 即只在定义该...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,706,989
精华内容 1,082,795
关键字:

静态