精华内容
下载资源
问答
  • 深入理解计算机系统lab1——gdb调试初步与debug x86汇编初步 以下仅供最简单的入门参考!!!!!!! 安装Linux环境,并进行简单程序的编译GDB调试 一、安装linux系统与环境 第一步,在所使用的电脑平台...

    深入理解计算机系统lab1——gdb调试初步

    以下仅供最简单的入门和参考!!!!!!!

    安装Linux环境,并进行简单程序的编译和GDB调试

    一、安装linux系统与环境

    在这里插入图片描述
    第一步,在所使用的电脑平台上安装linux系统与环境;
    下载VM这个虚拟机后,又下载ubantu的32位Linux操作系统,在VM成功创建了Linux环境的虚拟机。

    在这里插入图片描述

    二、在linux系统中使用gcc完成简单c语言的编译和执行

    第二步,成功在linux系统中使用gcc完成简单c语言的编译和执行;
    打开终端,vim hello.c进行编辑,编辑完成后按:wq保存并退出,gcc hello.c -o hello编译生成可执行文件,./hello将结果成功输出。

    1.打开终端,vim hello.c 新建hello.c

    在这里插入图片描述

    2.编辑hello.c

    在这里插入图片描述

    3.保存hello.c并退出

    在这里插入图片描述

    4.gcc编译,生成可执行文件,执行并查看运行结果

    在这里插入图片描述

    三、GDB进行程序基本的程序调试和反汇编

    第三步,使用GDB进行程序基本的程序调试和反汇编。

    1. gcc -g hello.c -o hello 生成可调试文件,gdb hello进入调试界面
      在这里插入图片描述

    2. list(l)将代码全部加载出来
      在这里插入图片描述

    3. breakpoint (b) 4(第四行)然后设置断点 ,并查看info b,添加成功。
      在这里插入图片描述

    4. run(r)执行,到断点处停止。
      在这里插入图片描述

    5. disassemble得到汇编代码。
      在这里插入图片描述

    实验补充
    四、使用指令新建、编辑、汇编、链接汇编语言程序
    4.1新建并编辑源代码

    命令:getdit sum.c
    说明:gedit是一个GNOME桌面环境下兼容UTF-8的文本编辑器。使用vi或者vim同样可以实现新建与编辑。
    在这里插入图片描述
    在这里插入图片描述

    4.2预处理

    命令:gcc -E sum.c -o sum.i
    说明:预处理时,编译器会将C源代码中包含的的头文件编译进来
    在这里插入图片描述
    在这里插入图片描述

    4.3编译

    命令:gcc -S sum.i -o sum.s
    说明:gcc首先检查代码的规范性,是否有语法错误,确定代码实际要做的工作,让后将代码翻译成汇编语言。
    在这里插入图片描述
    在这里插入图片描述

    4.4汇编

    命令:gcc -c sum.s -o sum.o
    说明:gcc进行汇编阶段,将编译阶段生成的”.s”文件转成二进制目标代码
    在这里插入图片描述

    4.5链接

    命令:gcc sum.o -o sum.out
    说明:链接过程将有关的目标文件彼此连接起来,使得所有目标文件成为一个能够执行的统一整体。
    在这里插入图片描述

    4.6执行

    命令:./sum.out
    说明:执行可执行文件,输出结果
    在这里插入图片描述

    五、能够使用gdb对汇编语言进行调试

    5.1生成汇编代码

    命令:gcc -g sum.c -o sum
    说明:使用命令生成可以调试文件
    在这里插入图片描述

    5.2开始调试

    命令:gdb sum
    说明:使用gdb对生成的可调试文件进行调试
    在这里插入图片描述

    5.3设置新的断点

    命令:breakpoint(b)
    说明:设置断点的命令是break,它通常有如下方式:
    break 在进入指定函数时停住
    break 在指定行号停住。
    break +/-offset 在当前行号的前面或后面的offset行停住。offiset为自然数。
    break filename:linenum 在源文件filename的linenum行处停住。
    break … if …可以是上述的参数,condition表示条件,在条件成
    立时停住。比如在循环境体中,可以设置break if i=100,表示当i为100时停住程序。
    可以通过info breakpoints [n]命令查看当前断点信息。
    在这里插入图片描述

    5.4单步执行程序

    命令:si/ni
    说明:ni/si都是汇编级别的断点定位。si会进入汇编和C函数内部,ni不会。

    5.5查看寄存器

    命令:info regs(i r)
    说明:命令i r能够查看所有寄存器的值
    在这里插入图片描述
    执行命令i r后打印出所有寄存器的列表
    在这里插入图片描述
    程序运行到第七行输出,此时查看寄存器的值,可见eax=9结果正确

    5.6查看指定内存内容

    命令:examine(x)
    说明:x的命令语法如下图所示
    在这里插入图片描述

    执行命令:x/10x $sp
    说明:打印当前栈stack的10个元素
    在这里插入图片描述
    当前栈的第6、7元素对应于a、b的值

    展开全文
  • 深入理解Android

    2019-05-28 08:28:18
    通过基础知识的学习,使大家了解手机屏幕显示的原理及各种手机硬件的传感器使用方法。通过讲解基本的设计规范及图标设计方法,使读者初步掌握移动应用设计知识。 下篇为道之篇,是进阶应用设计知识,详细讲解了从...

    深入理解Android

    《深入理解Android:卷I》是一本以情景方式对Android的源代码进行深入分析的书。内容广泛,以对Framework层的分析为主,兼顾Native层和Application层;分析深入,每一部分源代码的分析都力求透彻;针对性强,注重实际应用开发需求,书中所涵盖的知识点都是Android应用开发者和系统开发者需要重点掌握的。
    全书共10章,第1章介绍了阅读本书所需要做的准备工作,主要包括对Android系统架构和源码阅读方法的介绍;第2章通过对Android系统中的MediaScanner进行分析,详细讲解了Android中十分重要的JNI技术;第3章分析了init进程,揭示了通过解析init.rc来启动Zygote以及属性服务的工作原理;第4章分析了Zygote、SystemServer等进程的工作机制,同时还讨论了Android的启动速度、虚拟机HeapSize的大小调整、Watchdog工作原理等问题;第5章讲解了Android系统中常用的类,包括sp、wp、RefBase、Thread等类,同步类,以及Java中的Handler类和Looper类。

    目录案例


    下载地址:
    深入理解Android

    其它资料

    展开全文
  • 深入理解bootloader_1—– bootloader的初步概念1、引言 bootloader就是在操作系统内核运行之前运行的一小段程序。通过这个小程序我们主要完成下面几个内容: 1)初始化硬件设备。 2)建立内存空间的映射。 3)...

    深入理解bootloader_1—– bootloader的初步概念

    1、引言

     bootloader就是在操作系统内核运行之前运行的一小段程序。通过这个小程序我们主要完成下面几个内容:
    

    1)初始化硬件设备。
    2)建立内存空间的映射。
    3)创建内核需要的一些信息,并将这些信息通过相关机制,传递个给内核。
    4)将系统的软硬件环境设置成一个合适的状态。
    5)为最终调用操作系统内核准备好正确环境,真正起到引导和加载内核的作用。
    在嵌入式系统,通常没有PC 中BIOS那样的固件程序,因此整个系统的加载启动就完全由bootloader来完成。Bootloader 是CPU 上电后运行的第一段程序。不同的CPU 体系结构有不同的bootloader,有些bootloader支持多种体系结构的CPU,比如U-Boot就同时支持ARM和MIPS体系结构。除了依赖于CPU 的体系结构外,Bootloader实际上也依赖于具体的嵌入式版级设备的配置。也就是两块不同的嵌入式版,即使他们是基于同一种CPU而建,但是要想让运行在一块板子上的bootloader也运行到另一块板子上,通常个需要修改Bootloader源程序。因此每款Bootloader都是独一无二的,但我们可以总结开发或者维护Bootloader的一些背景知识,掌握这些背景知识就能够融会贯通。
    我们以ARM体系结构为参考要想掌握Bootloader起码要掌握下面一些知识:
    1)熟悉Linux的的开发环境,shell,make工程管理工具的使用。
    2)掌握ARM体系结构,指令集,独特的寻址方式。
    3)计算机的编译和链接。
    4)熟练掌握对U-Boot代码的 分析。

    2、Bootloader的角色

    当一个嵌入式开发板上电时,即使执行最简单的程序,都要初始化很多硬件。每种体系结构、处理器都有一组预定义的动作和配置,他们包含从单板的存储设备获取初始化代码的功能。最初的初始化代码是Bootloader的一部分,它负责启动处理器和相关硬件设备。
    上电复位时,大多数处理器都有一个获取第一条指令的默认初始地址。硬件设计人员利用该信息来进行存储空间的布局。这样以来,上电的时候,可从一个通用的已知地址获取代码,然后建立软件的控制。
    Bootloader提供初始化代码,并初始化单板,这样就可以执行其他程序,最初的初始化程序都是给体系结构下汇编语言写成的。在初始化相应的硬件信息之后,Bootloader会u引导完整的操作系统,他会定位加载操作系统,并将控制权交给操作系统。与传统的PC-BIOS不同,当操作系统获取控制权之后,嵌入式下
    的Bootloader将不复存在。

    3、不同体系下的BootLoader

    这里写图片描述

    文献参考:

    抄录自 《深入理解BoorLoader》 胡尔佳 编著(学习笔记仅作学习,交流,详细阅读请购买正版)

    展开全文
  • 之前看了很多关于Swift派发机制的内容,但感觉没有一篇能够彻底讲清楚这件事情,看完了这篇文章之后我对Swift的派发机制才建立起了初步的认知.一张表总结引用类型,修饰符它们对于Swift函数派发方式的影响.函数派发...
  • 深入理解Android-JNI的理解

    千次阅读 2018-07-27 00:04:04
    理解JNI需要理解以下问题: JNI的认识 JNI库的加载、相关native函数分析总结【借助于MediaScanner】 JNI函数注册 JNI里面类型转换 JNIEnv的认识 JNIEnv操作jobject JNI的异常处理 JNI的认识 JNI是Java ...

    理解JNI需要理解以下问题:

    • JNI的认识
    • JNI库的加载、相关native函数分析和总结【借助于MediaScanner】
    • JNI函数注册
    • JNIEnv的认识

    JNI的认识

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。在安卓中,主要做到以下两点:

    • Java程序中函数可以调用Native语言写的函数,Native一般指C/C++编写的函数

    • Native函数也可以反过来调用Java层函数

    Java平台中,为什么需要创建一个与Native相关的JNI技术呢?是不是破坏了Java的平台无关特性,其实主要考虑到如下方面:

    • Java世界的虚拟机使用Native语音写的,虚拟机又运行在具体的平台上,所有虚拟机是无法做到平台无关的。但是,JNI技术可以针对Java层屏蔽不同操作系统之间的差异,这样就能够实现平台无关特性。
    • C/C++语音已经有了很多成熟的模块,Java只需要直接调用即可。还有一些追求效率和速度的场合,需要Native语音参与的。
      在Android平台上,JNI就是一座将Native世界和Java世界的天堑变通途的桥。
      这里写图片描述

    本文从源码中的MediaScanner中来初步窥视JNI用法
    这里写图片描述
    上图可以看到Java层 、JNI层、Native层之间的架构,JNI是中间层【这里区分了libmedia_jni.so、libmedia.so:平常开发直接用一个.so 文件。这里区分为了说明JNI层和Native层】

    • Java世界对于的是MediaScanner,他内部的一些函数是需要由Native层来实现的。
    • JNI层对于的是libmedia_jni.so 。Android平台基本上都是采用“lib模块名_jni.so”的命名方式。
    • Native层对应的是libmedia.so 这个库完成了实际的功能。
    • MediaScanner将通过JNI层的libmedia_jni.so和Native层的libmedia.so交互

    源码位置:android\frameworks\base\media\java\android\media\MediaScanner.java


    public class MediaScanner
    {
    //1、静态代码块
        static {
            System.loadLibrary("media_jni");      //导入库
            native_init();                        //初始化操作,是一个native方法
        }
    
       //2、普通方法【非native方法】
       @Override
            public void scanFile(String path, long lastModified, long fileSize,
                    boolean isDirectory, boolean noMedia) {
                // This is the callback funtion from native codes.
                // Log.v(TAG, "scanFile: "+path);
                doScanFile(path, null, lastModified, fileSize, isDirectory, false, noMedia);
            }
    //3、native 方法【它的具体实现实在JNI层完成的】
        private native void processDirectory(String path, MediaScannerClient client);
        private native void processFile(String path, String mimeType, MediaScannerClient client);
        public native void setLocale(String locale);
    
        public native byte[] extractAlbumArt(FileDescriptor fd);
    
        private static native final void native_init();
        private native final void native_setup();
        private native final void native_finalize();
    
    }

    上面可以看到三点:1)加载JNI库 2)初始化Native层 3)声明native方法,具体实现再JNI层实现,应用层只需要声明native方法,程序中直接使用

    JNI库的加载

    加载jni库其实很简单,如上面MediaScanner源码中,静态代码块中直接调用System.loadLibrary方法就可以了。其参数就是动态库的名字,即media_jni.系统会根据不同的平台拓展成动态库文件,Linux系统会拓展成libmedia_jni.so,而在Windows平台会拓展成media_jni.dll

    通过MediaScanner.java 的native函数刨根问底,追一下native_init() 和 processFile(String path, String mimeType, MediaScannerClient client)

    源码位置:android\frameworks\base\media\jni\android_media_MediaScanner.cpp


    // This function gets a field ID, which in turn causes class initialization.
    // It is called from a static block in MediaScanner, which won't run until the
    // first time an instance of this class is used.
    static void android_media_MediaScanner_native_init(JNIEnv *env)
    {
        jclass clazz = env->FindClass(kClassMediaScanner);
        fields.context = env->GetFieldID(clazz, "mNativeContext", "I");
        if (fields.context == NULL) {
            return;
        }
    }
    //native 方法processFile的实现
    static void android_media_MediaScanner_processFile(
            JNIEnv *env, jobject thiz, jstring path,
            jstring mimeType, jobject client)
    {
       ......
        MediaScanner *mp = getNativeScanner_l(env, thiz);
        const char *pathStr = env->GetStringUTFChars(path, NULL);
        if (pathStr == NULL) {  // Out of memory
            return;
        }
        const char *mimeTypeStr =
            (mimeType ? env->GetStringUTFChars(mimeType, NULL) : NULL);
    ......
        MyMediaScannerClient myClient(env, client);
        MediaScanResult result = mp->processFile(pathStr, mimeTypeStr, myClient);
        env->ReleaseStringUTFChars(path, pathStr);
        if (mimeType) {
            env->ReleaseStringUTFChars(mimeType, mimeTypeStr);
        }
    }

    有兴趣好好看一下源码,肯定会有很多疑问,比如:JNIEnv 、FindClass、jclass、ReleaseStringUTFChars 等,都是什么,都在执行什么任务。

    不要急,且看如下内容!

    JNI函数注册

    所谓JNI函数注册就是将JNI层的native层的native函数和JNI层对于的实现函数关联起来,有了这种关联,在调用Java层测native函数时候,就能够顺利到JNI层对应的函数执行了。JNI函数注册有两种,我们主要分析第二种。

    • 静态注册

      静态注册就是直接在Java文件里写个native方法 然后再c/c++文件中实现这个方法就行了!流程如下:
      1)编写 java 代码;
      2)利用 javah 指令生成对应的 .h 文件;
      3)对 .h 中的声明进行实现;
      比如如下实现:

    JNIEXPORT jstring JNICALL
    Java_com_example_efan_jni_1learn2_MainActivity_stringFromJNI(
            JNIEnv *env,
            jobject /* this */) {
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }

    那么有哪些弊端呢:
    1)编写不方便,JNI 方法名字必须遵循规则且名字很长;
    2)编写过程步骤多,不方便;
    3)程序运行效率低,因为初次调用native函数时需要根据根据函数名在JNI层中搜索对应的本地函数,然后建立对应关系,这个过程比较耗时

    • 动态注册
      原理:
      利用 RegisterNatives 方法来注册 java 方法与 JNI 函数的一一对应关系
      实现流程:
      1) 利用结构体 JNINativeMethod 数组记录 java 方法与 JNI 函数的对应关系;
      2)实现 JNI_OnLoad 方法,在加载动态库后,执行动态注册;
      3)调用 FindClass 方法,获取 java 对象;
      4)调用 RegisterNatives 方法,传入 java 对象,以及 JNINativeMethod 数组,以及注册数目完成注册;
      优点:
      1)流程更加清晰可控;
      2)效率更高;
      静态改动态注册,只需要改JNI层代码:
    jstring stringFromJNI(JNIEnv *env, jobject thiz){
        std::string hello = "Hello from C++";
        return env->NewStringUTF(hello.c_str());
    }
    
    
    static const JNINativeMethod gMethods[] = {
            {"stringFromJNI", "()Ljava/lang/String;", (jstring*)stringFromJNI}
    };
    
    
    JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
    
        __android_log_print(ANDROID_LOG_INFO, "native", "Jni_OnLoad");
        JNIEnv* env = NULL;
        if(vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) //从JavaVM获取JNIEnv,一般使用1.4的版本
            return -1;
        jclass clazz = env->FindClass("com/example/efan/jni_learn2/MainActivity");
        if (!clazz){
            __android_log_print(ANDROID_LOG_INFO, "native", "cannot get class: com/example/efan/jni_learn2/MainActivity");
            return -1;
        }
        if(env->RegisterNatives(clazz, gMethods, sizeof(gMethods)/sizeof(gMethods[0])))
        {
            __android_log_print(ANDROID_LOG_INFO, "native", "register native method failed!\n");
            return -1;
        }
        return JNI_VERSION_1_4;
    }

    如上是一个简易的动态注册流程。
    Java native函数和JNI函数式一一对应的,其实在在动态注册中直接用一个数据结构来保存这种关联关系的,用一个JNINativeMethod 的结构。

    typedef struct {
    const char* name;         //name是Java中函数的名字
    const char* signature;    //signature,用字符串是描述了函数的参数和返回值 
    void* fnPtr;              //fnPtr是函数指针,指向C函数。
    } JNINativeMethod;

    咋们再分析下MediaScanner
    源码位置:master\android\frameworks\base\media\jni\android_media_MediaScanner.cpp


    static JNINativeMethod gMethods[] = {
        {
            "processDirectory",
            "(Ljava/lang/String;Landroid/media/MediaScannerClient;)V",
            (void *)android_media_MediaScanner_processDirectory
        },
    
        {
            "processFile",
            "(Ljava/lang/String;Ljava/lang/String;Landroid/media/MediaScannerClient;)V",
            (void *)android_media_MediaScanner_processFile
        },
    
        {
            "setLocale",
            "(Ljava/lang/String;)V",
            (void *)android_media_MediaScanner_setLocale
        },
    
        {
            "extractAlbumArt",
            "(Ljava/io/FileDescriptor;)[B",
            (void *)android_media_MediaScanner_extractAlbumArt
        },
    
        {
            "native_init",
            "()V",
            (void *)android_media_MediaScanner_native_init
        },
    
        {
            "native_setup",
            "()V",
            (void *)android_media_MediaScanner_native_setup
        },
    
        {
            "native_finalize",
            "()V",
            (void *)android_media_MediaScanner_native_finalize
        },
    };

    其中:processDirectory 、 processFile 、 setLocale 、 extractAlbumArt 、 native_init 、native_setup 、 native_finalize 方法不就是Java中native的放方法名么。

    AndroidRunTime 类提供了一个registerNativeMethods函数完成注册工作的,如下源码:
    \master\android\frameworks\base\core\jni\AndroidRuntime.cpp


    /*
     * Register native methods using JNI.
     */
    /*static*/ int AndroidRuntime::registerNativeMethods(JNIEnv* env,
        const char* className, const JNINativeMethod* gMethods, int numMethods)
    {
        return jniRegisterNativeMethods(env, className, gMethods, numMethods);  //就是这个方法
    }

    其中的jniRegisterNativeMethods是Android平台中为了方便JNI使用而提供的一个帮助函数。【RndroidRunTime源码可以看一看,有很多看了就非常熟悉的内容】

    \master\android\libnativehelper\JNIHelp.cpp


    extern "C" int jniRegisterNativeMethods(C_JNIEnv* env, const char* className,
        const JNINativeMethod* gMethods, int numMethods)
    {
        JNIEnv* e = reinterpret_cast<JNIEnv*>(env);
        scoped_local_ref<jclass> c(env, findClass(env, className));
       ---
       //下面的RegisterNatives 才是重点方法:真正实现注册的地方
       //调用JNIEnv 的RegiisterNatives 函数,注册关联关系
       //e 是env指针   c.get()得到jclass  gMethods是native的函数数组  
        if ((*env)->RegisterNatives(e, c.get(), gMethods, numMethods) < 0) {
          ---
        }
        return 0;
    }

    上面就完成了动态注册的流程, 还有一个问题需要考虑:这些动态注册的函数,什么时候和什么地方调用呢?
    当Java层通过System.loadLibrary加载JNI动态库后,紧接着会查找该库中的一个叫JNI_OnLoad的函数,如果有就调用它,而动态注册的工作就是在这里完成的。

    所以,如果想使用动态注册的方法,必须实现JNI_OnLoad函数,只有在这个函数中才有机会去完成动态注册的工作,有一些初始化工作可以在这里做的。
    对于libmediia_jni.so的JNI_OnLoad函数实在哪里实现?多媒体系统很多地方都用了JNI,所以源码里面放在了android_media_MediaPlayer.cpp中。
    \master\android\frameworks\base\media\jni\android_media_MediaPlayer.cpp


    
    jint JNI_OnLoad(JavaVM* vm, void* reserved)
    {
    //第一个参数类型是JavaVM,这可是虚拟机在JNI层的代表,每个进程中只有一个这样的JavaVM
        JNIEnv* env = NULL;
        jint result = -1;
        assert(env != NULL);
        //动态注册MediaScanner 的JNII函数
        if (register_android_media_MediaScanner(env) < 0) {
            ALOGE("ERROR: MediaScanner native registration failed\n");
            goto bail;
        }
        /* success -- return valid version number */
        result = JNI_VERSION_1_4;
    bail:
        return result;
    }

    总结流程如下图所示:
    这里写图片描述

    当Java层通过调用System.loadLibrary加载完JNI动态库后,紧接着会查找该库中一个叫JNI_OnLoad的函数。如果有,就调用他,而动态注册的工作就是在这里完成的。
    所以,如果想使用动态注册方法,必须实现JNI_OnLoad函数,只有这个函数才有机会完成动态注册的工作,静态注册则没有这个要求。

    JNIEnv的认识

    你会发现在JNI世界里,你是离不开JNIEnv,它就是一个与线程相关的代表JNI环境的结构体
    这里写图片描述

    上图可以看到:JNIEnv提供了一些JNI系统函数,通过这些函数可以

    • 调用Java函数【jni层调用java层】
    • 操作jobject对象等很多事情【jni层调用native】

    前面提到过JNI_OnLoad函数,第一个参数是JavaVM,它是虚拟机在JNI层的代表。

    JNI_OnLoad(JavaVM* vm, void* reserved)

    不论检查中多少个线程,JavaVM独此一份,在任意地方都可以使用它。
    JavaVM和JNIEnv关系:

    • JavaVM的AttachCurrentThread函数可以得到这个线程的JNIEnv结构体,这样后台就可以毁掉Java函数
    • 后台线程推出前,需要调用JvavVM的DetachCurrentThread函数来释放对应的资源

    总结:看看JNI底层实现,分析源码,初步了解JNI。具体实践还需要了解JNI层是怎么操作Java层函数和调用JNI层函数的。

    参考文章

    展开全文
  • MSR初步理解

    千次阅读 2011-07-18 09:20:01
    从没接触过MSR,也就是mining ...接下来的工作还是蛮多的,一方面要继续读相关论文,另一方面也要开始初步的编码工作了,把项目中有可能用到的技术提前学一学,每天也要写写代码来热身,避免手感不好造成的效率低下。
  • Keras的安装(pycharm)和初步理解

    千次阅读 2020-10-23 09:56:02
    配置Keras后端 windows下,在个人文件夹(如果你没改windows默认设置的话是C:/Users/%你的用户名%).keras\keras.json 基于keras的模型训练中tensorflowtheano使用 如果采用keras搭建模型,需要配置~/.keras/keras...
  • 深入理解构造析构函数

    千次阅读 2018-03-18 19:14:08
    深入理解构造析构函数 一、 概述构造函数析构函数是当你刚接触C++的时候就会碰到的两个概念,也是C++语法中较难掌握的两个概念。但是它们又是学习C++必须掌握的,可以说没有理解构造析构函数,你的C++就...
  • 医学图像分割的初步理解 文献: 1、Medical Image Segmentation Based on Deep Learning: A Review 2、基于深度学习的医学图像分割方法_游齐靖 3、基于深度学习的医学图像分割研究进展_宫进昌 主题:medical ...
  • linux3种驱动初步理解

    2016-03-08 22:44:43
    linux3种驱动,字符、块设备、网络设备驱动的初步理解
  • c# await async 的初步理解

    千次阅读 2019-07-29 15:09:32
    学习完深入理解C#关于await async的一些总结: 1. await async 的用法 2. await的一些限制 3.异步模式 4.可等待模式 5.从编译器的角度去理解 1. await async 的用法 async为修饰符用于在函数的返回值...
  • 汇编语言初步理解

    千次阅读 多人点赞 2016-04-17 14:06:59
    对于汇编语言我是怀着敬畏的心情了。这个技术需要极大耐心非常细腻的心思来编程的。或许,学生时期学习这个语言...深入理解计算机,不停的修炼自己的技术。无他,只是自己吃饭的家伙,实现自己梦想的工具而已!
  • GAN基本结构和初步理解 | 个人笔记

    千次阅读 2019-08-12 07:35:43
    GAN的基本结构和初步理解 记笔记是为了将已经了解的知识从个例抽象出来,以便将其运用到普遍情况并且记下易错点、难点,方便回忆 1. 基本结构    一个 GAN (生成对抗网络)的主要结构由一个 生成模型G ...
  • 深入理解Lambda

    万次阅读 多人点赞 2016-03-10 17:18:43
    概述 ...下面就来说说Lambda是如何进行转换工作的吧。 版权说明 著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:Q-WHai 发表日期: 2016年3月10日 链接:
  • 今天看了一下android事件的分发处理机制,以前完全没有去了解过,今天算是初步了解了一下,现将一些总结一下,以便日后复习巩固,当然这只是初步理解总结,距离深入还差很远。不对的地方,希望读者能够指出来,我...
  • AsyncTask的深入理解

    千次阅读 2019-08-15 18:29:29
    AsyncTask的深入理解 一、AsyncTask 1、初步理解 AsyncTask是一个轻量级的异步任务类,底层封装了ThreadHandler,AsyncTask不适合进行特别耗时的后台任务,特别耗时建议使用线程池。 public abstract class ...
  • 深入理解WindowManagerService

    千次阅读 2017-11-21 15:26:13
    深入理解Android 卷III》即将发布,作者是张大伟。此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分。在一个特别讲究颜值的时代,本书分析了Android 4.2中...
  • vertical-align初步理解

    千次阅读 2016-07-23 15:06:32
    官方案例: 起初只是在看公司框架时发现了这么一个没用过的属性,就初步了解了一下,由于自己没去用过,只是纯粹的看框架中如何使用vertical-align与在哪使用了,具体还是需要等之后接触后才能更深入理解。...
  • 【IT168 技术】权限两个字,一个权力,一个限制。在软件领域通俗的解释就是哪些人可以对哪些资源做哪些操作。在SQL Server中,”哪些人”,“哪些资源”,”哪些操作”...对于主体,安全对象权限的初步理解,见图1.图
  • 深入理解计算机系统-cachelab

    万次阅读 多人点赞 2018-07-18 22:01:04
    ③然后函数会根据选项字符串去你的输入进行匹配,当某个选项匹配时,函数会返回该选项对应的字符,而该选项对应的参数会存入变量optarg中,该变量是包含在头文件中的,这样一来的话我们就可以快速而简洁地分析...
  • 深入理解Android 卷III》即将发布,作者是张大伟。此书填补了深入理解Android Framework卷中的一个主要空白,即Android Framework中和UI相关的部分。在一个特别讲究颜值的时代,本书分析了Android 4.2中...
  • 深入理解python语言

    2019-09-15 14:57:29
    python基本图形绘制 2.1 深入理解python语言 2.2 实例2:python蟒蛇绘制 2.3 模块1:turtle库的使用 2.4 turtle程序语法元素分析 方法论层面 Python语言及海归绘图体系 实践能力方面 初步学会使用...
  • this初步深入学习

    2016-04-28 12:11:00
    一连串的蝴蝶效应让我深深的认识到自己学习的马虎,总是为求快的一笔带过,结果到最后自己也没能很深入的去了解那些看似浅显却需要很细心耐心去理解的知识点,所以在这里我借用阮大大的几个例...
  • 对MVC的初步理解

    千次阅读 2013-12-15 19:56:53
    数据模型用于封装业务逻辑相关数据,以及对数据处理方法,例如程序员编写程序应有的功能,数据库专家进行数据库设计数据库管理。模型可以直接访问数据而不依赖与视图或者控制器。并且模型并不关心他自己是如何被...
  • 应该很容易理解,其中的 rstride (row stride) cstride (column stride) (stride是步长的意思,row : 行,column : 列)参数也有了初步的介绍,下面重点讨论如何理解他们。 初探 旋转 3D 图形, 我发现无论是x向...
  • java语言深入理解

    2019-05-21 13:47:23
    发现一个大佬关于深入理解java语言的专栏,将链接在此汇总方便自己学习。 专栏链接:https://blog.csdn.net/brave2211/column/info/zhangjg-java-blog java中的类加载器 java中数组的特性 Java中的String为什么是不...
  • 深入理解JavaScript的执行机制(同步异步)

    万次阅读 多人点赞 2017-11-24 19:25:59
    深入理解JavaScript执行机制
  • 深入理解Java虚拟机-走近Java

    万次阅读 多人点赞 2020-01-02 15:02:08
    阅读《深入理解Java虚拟机》受益匪浅,对Java虚拟机有初步的认识。这里写博客主要出于以下三个目的:一方面是记录,方便日后阅读;一方面是加深对内容的理解;一方面是分享给大家,希望对大家有帮助。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,609
精华内容 19,043
关键字:

初步理解和深入理解