精华内容
下载资源
问答
  • 从设计出发去解决问题,才是正确处理方式。 首先 内存泄漏,给内存泄漏一个定义: 申请了内存,但是巴拉巴拉等等操作之后,这块内存没有在使用中,之后也无法使用到,这块内存被认为是泄漏,这块内存被占领了, ...

    今天听到几个大佬在讨论内存泄漏的处理方案,不是我在的项目,我也不好多插嘴,
    但是不认为打补丁的方式,去找泄漏的资源和内存去卸载是个正确做法,所以分享一下我以往的内存管理的经验。

    从设计出发去解决问题,才是正确的处理方式。

    首先 内存泄漏,给内存泄漏一个定义:
    申请了内存,但是巴拉巴拉等等操作之后,这块内存没有在使用中,之后也无法使用到,这块内存被认为是泄漏的,这块内存被占领了,
    无法被重复使用了。这样的事情多来几次,那么当前程序占领的内存就越来越大。超过系统的单个进程使用上限,系统就会强制结束进程。
    以前的WindowsXP 好像是1.5G??记不清了。手机上就是不同的手机不一样,表现就是闪退。

    在Unity里面表现例如是

     public class NewBehaviourScript : MonoBehaviour
    {
        List<int> m_list = new List<int>();
    
        // Update is called once per frame
        void Update()
        {
            if (Input.GetKeyDown(KeyCode.A))
            {
                for (int i = 0; i < 1000000; i++)
                {
                    m_list.Add(i);
                }
                Debug.Log(m_list.Count);
            }
            if (Input.GetKeyDown(KeyCode.S))
            {
                GameObject.Destroy(this.gameObject);
            }
        }
    }
    

    我新建一个Scene,创建一个GameObject,挂上上面这个脚本,然后运行起来拼命点 键盘a,
    嗯,和你想想的一样,内存就涨起来了。
    然后我按S销毁自己的对象,
    好了,这样m_list就泄漏了,因为这个List无法被其他地方使用了,但是我又不能再去操作他了,但是内存还在(可以看Profiler的Memory)

    关于AssetBundle泄漏,就比较简单明了,加载了一个资源之后没有做卸载的操作。

    关于AssetBundle泄漏,我之前发过一篇文章了,说的是 计数型AssetBundle加载管理(点击跳转).,主要解决的问题是,有多个对象要使用同一个AB的资源,
    那么正确的卸载时间应该是在最后一个不使用这个资源的对象释放这个资源之后。这样就能明确的管理AB的生命周期。

    那么刚才提到了 生命周期 的概念,什么是生命周期,怎么样算一个生命周期。

    其实顾名思义,人有生命,从出生到去见上帝。
    那么内存也是一样的,new就是出生了,delete就是死亡了。

    对于Unity来说MonoBehaviour里 Awake就是出生,OnDestroy就是死亡。
    像是C++里面的构造和析构对应就是 出生和死亡。

    所以这里说到的内存管理,变量,数据结构,AB等等也都是有生命周期的,生命周期开始把对象new出来,生命周期结束,把对象给销毁掉。
    那么对于AB来说,就是加载和卸载,因为有计数型AssetBundle加载管理(点击跳转). 的文章了,就不多说了,来说说数据的生命周期。

    计数型AssetBundle加载管理里有说到 加载卸载对齐,
    数据方面也是一样的例如:

    public class NewBehaviourScript : MonoBehaviour
    {
        List<int> m_list = null;
    
        private void Start()
        {
            m_list = new List<int>();
        }
    
        private void OnDestroy()
        {
            if (m_list != null)
            {
                m_list.Clear();
                m_list = null;
            }
        }
    }
    

    这就可以认为m_list有一个完整的生命周期了,在NewBehaviourScript被创建的时候 m_list为null没有内存,
    我认为它应该从这个脚本的 Start时候出生,于是new了一块内存给它,然后我认为它该在这个脚本被销毁的时候被销毁。
    所以就可以说是 m_list的生命周期是从这个脚本的Start开始到这个脚本销毁。

    那也会有一些工具脚本,或者单例什么的,其实意思也是一样的,例如

    public class Test
    {
        private List<int> m_list = null;
    
        /*
         * 假装这里有很多逻辑
         * void function()
         * {
         * ......****
         * }
         */
    
        public void Init()
        {
            m_list = new List<int>();
        }
    
        public void Release()
        {
            if (m_list != null)
            {
                m_list.Clear();
                m_list = null;
            }
        }
    }
    
    public class NewBehaviourScript : MonoBehaviour
    {
        private void Start()
        {
            Test t = new Test();
            t.Init();
            t.Release();
            t = null;
        }
    }
    

    那么这里 Test t,对象t的生命周期 就是从new开始到被赋值为null,
    Test内部的m_list的生命周期 就是 从Init调用开始到Release。
    在这段代码中如果t.Release();不调用,那么生命周期就不完整了,就出生没死亡,那么就很容易造成泄漏了。
    那么有人会说了,我有其他写法,例如:

    public class Test
    {
        public List<int> m_list = null;
    
        /*
         * 假装这里有很多逻辑
         * void function()
         * {
         * ......****
         * }
         */
    
        public void Init()
        {
            m_list = new List<int>();
        }
    }
    
    public class NewBehaviourScript : MonoBehaviour
    {
        private void Start()
        {
            Test t = new Test();
            t.Init();
            t.m_list.Clear();
            t.m_list = null;
            t = null;
        }
    }
    

    那么像是这样的代码,在Test里面申请了内存,在外面做释放。
    这样做可以吗?回答:可以。这样会内存泄漏嘛?回答:不会。
    那么这样做对吗?回答:不对!

    (其实学C++应该比较容易理解,一个指针在一个类里面new,在其他类free,那么我觉得你可能要被你的上司骂死了。)

    这边要说一个重点就是生命周期在一个良好的设计里,一定是成对出现的,也就是之前说的“加载卸载对齐”
    其实生命周期也是需要做 “创建销毁对齐”

    哪里创建,哪里销毁,保证这个对象是由当前所在的脚本去维护去管理的,这其实也体现了 访问属性public protected private的意义。
    意思就是,我的手脚是我自己的,我不能分给你,你只能看一看,或者我帮你做什么事,但是手脚不是你的,是我的,你打断了我的手脚是要赔偿的(赔偿就是内存泄漏或者崩溃或者闪退)。
    比喻不太恰当,差不多这个意思。嘿嘿嘿。

    那在上面说的基础上,我的对象由我自己管理,那么其他模块就是使用我的对象,我管理着对象的生命周期,卸载不卸载那就是我说了算,
    那么其他地方就算引用了这个对象,也不会造成泄漏,因为如果这个对象的生命周期到了,其他地方还在使用就会报错了,空指针异常,不会造成内存泄漏。
    (这边的,指的是这个对象所在的脚本,拟人一下)

    所以如果发现了内存泄漏,最正确的做法,首先是设计有没有问题?
    在设计正确的基础上,再去找泄漏点,再针对的修补,
    而不要一发现泄漏就想着去补,会导致框架的结构越来越差,到后期就会难以维护。

    差不多就这点,浅谈一下。之后有机会针对写详细的文章po出来。


    程序学无止尽。
    欢迎大家沟通,有啥不明确的,或者不对的,也可以和我私聊
    我的QQ 334524067 神一般的狄狄

    展开全文
  • 一、软件测试: 1、经典定义: 软件测试(Software Testing),在规定条件下对程序进行操作,已...软件测试目的在于发现问题,检查系统是否满足需求。 二、软件测试方法和分类 三、生命周期各测试方法对比 ...

    一、软件测试:

    1、经典定义:
    软件测试(Software Testing),在规定的条件下对程序进行操作,已发现程序错误,衡量软件质量,并对其是否满足设计要求进行评估的过程。
    2、标准定义:
    软件测试使用人工或自动的手段来运行或测定某个软件系统的过程,其目的是在于检验他是否满足规定的需求或弄清预期结果与实际结果的差别。
    3、软件测试的目的:
    软件测试的目的在于发现问题,检查系统是否满足需求。

    二、软件测试的方法和分类

    在这里插入图片描述

    三、生命周期各测试方法对比

    在这里插入图片描述

    展开全文
  • NET还有一个AppDomain(相当于进程中的子进程)的概念貌似吧一个dll从AppDomain卸载该dll中的静态变量也会跟着挂了而吧AppDomain从进程中卸载该AppDomain中的所有静态变量都挂了微软提成AppDomain的一个原因就是让.....

    查找资料,发现这一段有用,摘自:http://bbs.csdn.net/topics/390065743

    静态变量都是和进程同生共死的

    其实。NET 还有一个AppDomain(相当于进程中的子进程)的概念
    貌似吧一个dll从AppDomain卸载 该dll中的静态变量也会跟着挂了
    而吧AppDomain从进程中卸载 该AppDomain中的所有静态变量都挂了

    微软提成AppDomain的一个原因就是让IIS进程中可以有多个AppDomain
    每个AppDomain基本运行着一个网站
    当然你可以让每个进程都运行一个网站

    总结:AppDomain的概念对我来说比较有用。

    摘自:http://kb.cnblogs.com/page/104263/

      静态类可以视为类库里都是单一的过程,不存在“状态”的概念,就可以使用静态类。

      非静态类可以包含静态方法,但静态类不能包含非静态方法。 

    转载于:https://www.cnblogs.com/xyzyyj/archive/2013/01/11/2856426.html

    展开全文
  • 目录 概述 生命周期 安装环境 核心概念 ...Maven在IDEA中应用 ... 项目中需要数量众多 jar 包,需要手动下载并引入,并且多个项目需要 jar 包存在重复的问题; 项目中需要 jar 包有版本兼.

    目录

    概述

    生命周期

    安装环境

    核心概念

    目录结构

    仓库

    pom

    常用命令

    构建原理

    配置插件

    Maven在IDEA中的应用

          IDEA中集成Maven

         创建Maven项目

    依赖管理

    Maven常用设置

         全局变量

         指定资源位置


    概述

    在传统开发中存在诸多问题

    • 一个项目做成一个工程,造成工程比较庞大,需要使用多模块来划分项目;
    • 项目中需要的数量众多的 jar 包,需要手动下载并引入,并且多个项目需要的 jar 包存在重复的问题;
    • 项目中需要的 jar 包有版本兼容的问题,需要手动解决;
    • 项目中需要的 jar 包又依赖其它的 jar 包,需要手动解决。

    maven的出现成功解决了上述问题,Maven 翻译为"专家"、"内行",是 Apache 下的一个纯 Java 开发的开源项目。基于项目对象模型(缩写:POM)概念,可以对 Java 项目进行构建、依赖管理。Maven 是目前最流行的自动化构建工具,对于生产环境下多框架、多模块整合开发有重要作用,Maven 是一 款在大型项目开发过程中不可或缺的重要工具。

    Maven 可以整合多个项目之间的引用关系,我们可以根据业务和分层需要任意拆分一个项目; Maven 提供规范的管理各个常用 jar 包及其各个版本,并且可以自动下载和引入项目中; Maven 可以根据指定版本自动解决 jar 包版本兼容问题;
    Maven 可以把 jar 包所依赖的其它 jar 包自动下载并引入项目。 

    生命周期

    • 清理:删除以前的编译结果,为重新编译做好准备。
    • 编译:将Java源程序编译为字节码文件。
    • 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
    • 报告:在每一次测试后以标准的格式记录和展示测试结果。
    • 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应war包。
    • 安装:在Maven环境下特指将打包的结果——jar包或war包安装到本地仓库中。
    • 部署:将打包的结果部署到远程仓库或将war包部署到服务器上运行

    安装环境

    1. 确保安装了 java 环境:maven 本身就是 java 写的,所以要求必须安装 JDK。 查看 java 环境变量:echo %JAVA_HOME%
    2. 下载并解压 maven 安装程序: http://maven.apache.org/download.cgi
    3. 配置 Maven 的环境变量:
      MAVEN_HOME=d:/apache-maven-3.3.9 或者 M2_HOME=d:/apache-maven-3.3.9

      path=%MAVEN_HOME%/bin; 或者%M2_HOME%/bin;

    4. 验证是否安装成功: mvn –v

    核心概念

    Maven能够实现自动化构建是和它的内部原理分不开的,这里我们从 Maven的九个核心概念入手, 看看Maven是如何实现自动化构建的

    • POM
    • 约定的目录结构
    • 坐标
    • 依赖管理
    • 仓库管理
    • 生命周期
    • 插件和目标
    • 继承
    • 聚合

    目录结构

    maven中约定这样的目录结构

           Hello

               |---src
               |---|---main

               |---|---|---java

               |---|---|---resources

               |---|---test

               |---|---|---java

               |---|---|---resources

               |---pom.xml

    说明:        

    Hello:根目录,也就是工程名 src:源代码

    main:主程序
    java:主程序的 java 源码 resources:主程序的配置文件

    test:测试程序
    java:测试程序的 java 源码 resources:测试程序的配置文件 pom.xml:Maven 工程的核心配置文件。

    仓库

    1:仓库的分类 

           【1】:本地仓库:当前电脑上部署的仓库目录,为当前电脑上所有Maven工程服务

            【2】:远程

                   a私服:搭建在局域网环境下,为当前局域网范围内的所有Maven工程服务

                   b:中央仓库:架设在Internet上,为全世界所有Maven工程服务

                   c:中央仓库镜像:为了分担中央仓库的流量,提升用户俯冲速度。

    2:仓库中保存存的内容:Maven工程

        【1】Maven自身所需要的插件

        【2】第三方框架或工具的jar包

        【3】我们自己开发的Maven工程。

    3.开发人员需要使用mysql驱动--->maven首先查本地仓库--->私服--->镜像--->中央仓库

    pom

    pom:项目对象模型,是一个pom.xml文件
    1)坐标唯一值, 在互联网中唯一标识一个项目的
          <groupId>公司域名的倒写</groupId>
         <artifactId>自定义项目名称</artifactId>
         <version>自定版本号</version>
    2) packaging: 打包后压缩文件的扩展名,默认是jar ,web应用是war 
              packaging 可以不写, 默认是jar
    3) 依赖
            dependencies 和dependency ,相当于是 java代码中import

             <dependencies>
                <!--依赖  java代码中 import -->
              <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.9</version>
             </dependency>
         </dependencies>

     4)properties:设置属性

     5)build : maven在进行项目的构建时, 配置信息,例如指定编译java代码使用的jdk的版本等

    常用命令

    • mvn clean 清理(会删除原来编译和测试的目录,即target目录,但是已经install到仓库里的包不会删除)
    • mvn compile 编译主程序(会在当前目录下生成一个 target,里边存放编译主程序之后生成的字节码文件)  target中
    • mvn test-compile编译测试程序(会在当前目录下生成一个 target,里边存放编译测试程序之后生成的字节码文件)   
    • mvn test 测试(会生成一个目录surefire-reports,保存测试结果)
    • mvn package打包主程序(会编译、编译测试、测试、并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包)
    • mvn install 安装主程序(会把本工程打包,并且按照本工程的坐标保存到本地仓库中)
    • mvn install -Dmaven.test.skip=true 跳过test
    • mvn deploy 部署主程序(会把本工程打包,按照本工程的坐标保存到本地库中,并且还会保存到私服仓库中。还会自动把项目部署到 web 容器中)。

    构建原理

    maven 过程构建周期,由 maven 的插件 plugin 来执行完成。如下图所示

    • clean插件maven-clean-plugin:2.5

           --   clean 阶段是独立的一个阶段,功能就是清除工程目前下的 target 目录)

    • resources插件maven-resources-plugin

           resource 插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝 src\main\resources 目录下的件到
           classes 目录下(见下图)

           

    • compile插件maven-compiler-plugin

           compile 插件执行时先调用 resouces 插件,功能就是把 src\mainjava 源码编译成字节码生成 class 文件,并把编译好
           的 class 文件输出到 target\classes 目录下

    • test 插件 maven-plugin:2.12.4:test 

           单元测试所用的 compile 和 resources 插件和主代码是相同的,但执行的目标不行,目标 testCompile 和 testResources
           是把 src\test\java 下的代码编译成字节码输出到 target\test-classes,同时把 src\test\resources 下的配置文件拷贝到
          target\test-classes

    • package插件maven-jar-plugin/maven-war-plugin

          把 class 文件、配置文件打成一个 jar(war 或其它格式)包

    • deploy发布插件maven-install-plugin

    发布插件的功能就是把构建好的 artifact 部署到本地仓库,还有一个 deploy 插件是将构建好的 artifact 部署到远程
    仓库

    maven-resources-plugin 过程

    配置插件

    插件可以在自己的项目中设置,最常使用的是 maven 编译插件。设置项目使用的 jdk 版本时通过编译插件指定。
    pom.xml 文件<build>中设置。

    <build>
    <plugins>
       <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.1</version>
          <configuration>
             <source>1.8</source>
             <target>1.8</target> </configuration>
       </plugin>
    </plugins>
    </build>

    运行mvn compile后可以看到设置的新版本插件生效了

    Maven在IDEA中的应用

    IDEA中集成Maven

    创建Maven项目

    • File-Nem-Project

    填写坐标

    填写项目名称

    生成的目录结构

    依赖管理

    Maven解析依赖信息时会到本地仓库中查找被依赖的jar包,依赖的范围:compile、test、provided,默认采用 compile

     

    compile

    test

    provided

    对主程序是否有效

    对测试程序是否有效

    是否参与打包

    是否参与部署

    Maven常用设置

    全局变量

    在 Maven 的 pom.xml 文件中,<properties>用于定义全局变量,POM 中通过${property_name}的形式引用变量的值。 定义全局变量:

    指定资源位置

    src/main/java 和 src/test/java 这两个目录中的所有*.java 文件会分别在 comile 和 test-comiple 阶段被编译,编 译结果分别放到了 target/classes 和 targe/test-classes 目录中,但是这两个目录中的其他文件都会被忽略掉,如果需 要把 src 目录下的文件包放到 target/classes 目录,作为输出的 jar 一部分。需要指定资源文件位置。以下内容放到 <buid>标签中。

     

    展开全文
  • VB中作用域问题和生命周期

    千次阅读 热门讨论 2014-07-30 20:45:30
    在学生信息管理系统中我发现变量和过程的作用域问题很重要,稍不注意就可能出错。我一直认为中文起名字...这样一个生命周期的概念就比较形象地建立起来了。 下面举个例子: '通用窗体 Public i As Integer '过程1 Pri
  • 处理维度表历史变化信息的问题称为处理缓慢变化维的问题,简称SCD问题。处理缓慢变化维方法有以下几种常见方式: 保留原值 直接覆盖 增加新属性列 快照表 拉链表 1、保留原始值 维度属性值不做更改,...
  • 概念文章目的是针对以下方面提出建议:(1)既有货币和金融体系中系统性缺陷,尤其是造成兴衰周期的机制; (2)认知和行动因素限制了中央银行持续有效地调节或限制这些周期的能力。 借鉴早期研究(我们自己...
  • 第1章 主数据管理的背景一级目录1.1 信息时代的企业发展三级目录1.2 数据资产1.2.1 数据资产的概念 一级目录 1.1 信息时代的企业发展 三级目录 主数据管理实质上是个管理问题。 主数据管理正是从杂乱的数据中...
  • 本文是作者在11月29日由中国国际商会和中国投资协会联合主办“大变局”数字...前几天周小川行长在他谈货币供给和资产价格讨论中他也提出长周期的概念,我主要分成这样几个部分: 第一个是我们需要对传统产业周期,科技.
  • 需求:需要app在后台一直记录当前位置坐标,5s上传服务器...AlarmManager:概念:AlarmManager是一个全局定时器,是Android中常用一种系统级别提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,B
  • 别再问我多线程这些问题了 生命周期:10 张图聊聊线程生命周期和常用 APIs(在微信公众号“码农田小齐”里) 生产者消费者模型:多线程必考「生产者 - 消费者」模型,看齐姐这篇文章就够了 全部是转载,感觉...
  • 线程声明周期一定要搞懂,可以参考《操作系统概念》,有几种状态切换要搞懂 JDK中用Thread.State类定义了线程几种状态。要想实现多线程,必须在主线程中创建新线程对象。Java语言使用Thread类及其子类对象...
  • 0592MHz的 怎么算 还有就是时钟周期,状态周期的概念和联系及换算? 你的不明白其实就是对于定时器的初值问题,11.0592是始终的晶振,时钟周期就是1/11.0592M 而定时器的周期就是12/11.0592 因为51单片机是12分频...
  • 在这里涉及2个概念,作用域与生命周期。 作用域指是描述变量在哪段代码中有效;生命周期是变量什么时候被创建,什么时候被释放。 特别注意是当全局变量和局部变量同名时,优先使用是局部变量。 #...
  • 具体表现:死机、死循环,导致数据库数据丢失,与数据库连接错误,主要功能丧失,基本模块缺失等问题。 严重:系统可以运行,但是不稳定,如果继续运行,会发生严重后果。 具体表现:数据泄露、直播画面失真、密码...
  • Maven概念及配置问题

    2020-09-04 14:45:14
    一、Maven的概念 1、 Maven是一个跨平台的项目管理工具,从中央仓库下载的jar包,都会统一存放到本地仓库中。 2、Maven主要功能是统一开发规范与包的依赖管理: 依赖的管理:maven对项目中jar包的管理过程。传统工程...
  • 问题: 服务器在接收到浏览器请求后,会自动调用对应逻辑代码进行请求处理。 但是逻辑代码是由程序员编写并放到服务器中,那么服务器怎么知道该怎么调用并调用哪个类和哪个方法来进行请求处理。 解决: ...
  • RTOS特点: 必须要有一个中断,其服务要保证在一个给定时间内完成...硬件开销部分,从中断到来,过了若干个周期才会把中断标志位IFR置位,然后通过对IFR逻辑判断是否响应中断,需要话,把指令流水线排空,然后
  • 趣味故事理解.NET概念——关于.NET接口、事件与委托的概念问题从前,在南方一块奇异的土地上,有个工人名叫彼得,他非常勤奋,对他的老板总是百依百顺。但是他的老板是个吝啬的人,从不信任别人,坚决要求随时知道...
  • 函数的准周期性质的概念由Harald Bohr在1921年提出,它的大致含义是,函数在每个垂直线上都(近似)周期地接近于我们想要的值,该值在任意点属于到那条线和一个有界域Ω。 他证明了普通Dirichlet级数定义的函数在其...
  • 概念描述保密防止未经授权信息泄露完整性防止未经授权,无意或不正确修改软件或数据可用性确保系统和信息可用性认证建立用户或信息系统身份信任系统授权建立资源访问权限审计/记录建立用户操作和...
  • 关于static和函数重入概念一直模糊,最近也是查看许多资料,发现网上博客基本上都是复制粘贴,看云里雾里。再看了众多大神文章后,动手实验了一下,遂记录于此。由于本人水平有限,若文章有错误之处,也欢迎...
  • 多线程基本概念 线程状态与生命周期 多线程四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread使用 GCD理解与使用 NSOperation理解与使用 ...
  • Android生命周期

    2017-03-01 13:04:49
    Acticity作为Android四大组件之首,但是在使用过程中总有一些不容易搞清楚的概念,主要是他的生命周期和启动模式,以及IntentFilter的匹配规则分析。下面将结合底层揭开这几个问题的面纱。  1.生命周期   ...
  • 4.5采样周期对 HHT 算法影响4.5.1 整周期采样定义在仿真实验中我们发现,...整周期采样最初是在傅立叶变换中根据离散信号要求提出来,在此我们把这个概念引入到希尔伯特-黄变换中来。设HHT频谱分辨率为Δ...
  • 0592MHz的 怎么算 还有就是时钟周期,状态周期,机器周期的概念和联系及换算? 你的不明白其实就是对于定时器的初值问题,11.0592是始终的晶振,时钟周期就是1/11.0592M 而定时器的周期就是12/11.0592 因为51...
  • Fragment生命周期

    2017-03-15 21:38:54
    Fragment生命周期 1.fragment产生及概念 产生:Android运行在各种各样设备中,有小屏幕手机,超大屏平板甚至电视。针对屏幕尺寸差距,很多情况下,都是先针对手机开发一套App,然后拷贝一份,修改...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,791
精华内容 716
关键字:

周期问题的概念