函数调用

0day学习笔记(2)--函数调用

﹥>﹥吖頭↗ 提交于 2020-02-08 19:27:21
函数调用过程 调用函数操作 函数参数入栈(在当前函数栈帧),从左至右或从右至左视情况而定 一般为从右至左 mov 地址,参数 的一个操作并不直接pop而是定位到地址将参数传递进去 call offerset : 调用函数,call标识符或地址. 同时为要调用的函数开辟新的栈帧 向栈中压入当前指令的地址,即返回地址 跳转到调用函数的入口地址 返回的时候有类似retn的操作 调整栈顶和栈底 push ebp :将上一个函数栈底入栈,在上一个函数的栈顶 mov ebp,esp sub esp ,10h :10h指的是新栈的大小 一系列新的函数的操作… 调用结束: leave : 调整栈帧的指令 mov esp,ebp pop ebp retn : POP EIP jmp offerset 调用main函数时有 and esp, 0FFFFFFF0h : 字节对齐(16位)的一个操作,编译优化需要 返回地址 将要调用函数的参数2 将要调用函数的参数1 当前函数的一系列变量,参数,地址 以上即是调用完一个函数后属于上一个函数的栈空间的内容 来源: CSDN 作者: lonmar. 链接: https://blog.csdn.net/weixin_45551083/article/details/104224787

C++处理异常技巧-try,catch,throw,finally

一个人想着一个人 提交于 2020-02-08 19:15:51
异常处理的基本思想是简化程序的错误代码,为程序键壮性提供一个标准检测机制。 也许我们已经使用过异常,但是你会是一种习惯吗,不要老是想着当我打开一个文件的时候才用异常判断一下,我知道对你来说你喜欢用return value或者是print error message来做,你想过这样做会导致Memory Leak,系统退出,代码重复/难读,垃圾一堆…..吗?现在的软件已经是n*365*24小时的运行了,软件的健壮已经是一个很要考虑的时候了。 自序: 对写程序来说异常真的是很重要,一个稳健的代码不是靠返回Error Message/return Value来解决的,可是往往我们从C走过来,习惯了这样的方式。 仅以本文献给今天将要来临的流星雨把,还好我能在今天白天把这写完,否则会是第4个通宵了;同时感谢Jeffrey大师,没有他的SEH理论这篇文章只能完成一半,而且所有SEH列子的构想都来自他的指导;另外要感谢Scott Meyers大师,我是看他的书长大的;还要感谢Adamc / Darwin / Julian ,当然还有Nick的Coffee 内容导读: (请打开文档结构图来读这篇文章。) 本文包括2个大的异常实现概念:C++的标准异常和SHE异常。 C++标准异常:也许我们了解过他,但你有考虑过,其实你根本不会使用,你不相信,那我问你:垃圾回收在C++中怎么实现?其实不需要实现,C+

Python学习10:函数的参数

我与影子孤独终老i 提交于 2020-02-08 15:51:03
同样,我们在com.second.function下创建Demo03.py 定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。对于函数的调用者来说,只需要知道如何传递正确的参数,以及函数将返回什么样的值就够了,函数内部的复杂逻辑被封装起来,调用者无需了解。 Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口,不但能处理复杂的参数,还可以简化调用者的代码。 位置参数 我们先写一个计算x2的函数: def power ( x ) : return x * x 对于power(x)函数,参数x就是一个位置参数; 当我们调用的时候,必须传入有且仅有的一个参数x: >> > power ( 5 ) 25 >> > power ( 15 ) 225 现在,如果我们要计算x3怎么办?可以再定义一个power3函数,但是如果要计算x4、x5……怎么办?我们不可能定义无限多个函数。 你也许想到了,可以把power(x)修改为power(x, n),用来计算xn,说干就干: def power ( x , n ) : s = 1 while n > 0 : n = n - 1 s = s * x return s 对于这个修改后的power(x, n)函数,可以计算任意n次方: >> >

数组遍历的方法

只愿长相守 提交于 2020-02-08 13:40:44
1.for循环 使用临时变量,将长度缓存起来,避免重复获取数组长度,当数组较大时优化效果才会比较明显。 1 2 3 for (j = 0,len=arr.length; j < len; j++) { } 2.foreach循环 遍历数组中的每一项,没有返回值,对原数组没有影响,不支持IE 1 2 3 4 5 6 //1 没有返回值 arr.forEach((item,index,array)=>{ //执行代码 }) //参数:value数组中的当前项, index当前项的索引, array原始数组; //数组中有几项,那么传递进去的匿名回调函数就需要执行几次; 3.map循环 有返回值,可以return出来 map的回调函数中支持return返回值;return的是啥,相当于把数组中的这一项变为啥(并不影响原来的数组,只是相当于把原数组克隆一份,把克隆的这一份的数组中的对应项改变了); 1 2 3 4 5 6 7 arr.map( function (value,index,array){    //do something    return XXX }) 1 2 3 4 5 6 var ary = [12,23,24,42,1]; var res = ary.map( function (item,index,ary ) { return item*10; })

JS中精选this关键字的指向规律你记住了吗

安稳与你 提交于 2020-02-08 04:17:08
1.首先要明确: 谁最终调用函数,this指向谁 this指向的永远只可能是对象!!!!! this指向谁永远不取决于this写在哪,而取决于函数在哪里调用! this指向的对象,我们称之为函数的上下文context,也叫做函数的调用者是谁! 2.this指向的规律(与函数调用的方式息息相关) this指向的情况取决于函数调用的方式有哪些(总结如下): 2.1.通过函数名()直接调用--this 指向window; function func(){ console.log(this); } func(); 2.2.通过对象.函数名()调用的--this指向这个对象 狭义对象: this指向--obj var obj={ name:"obj", func1:func }; obj.func1(); 广义对象: this指向--div document.getElementById("div").onclick=function(){ this.style.backgroundColor="red"; } 2.3. this指向——数组arr var arr=[func,1,2,3]; arr[0](); 2.4.函数作为window内置函数的回调函数调用,this指向window setInterval,setTimout等 setInterval(func,1000);

AngularJS的this详解

主宰稳场 提交于 2020-02-08 03:43:55
【this详解】 1、谁最终调用函数,this指向谁。 ① this指向的,永远只可能是对象!!!!!! ② this指向谁,永远不取决于this写在哪!!而是取决于函数在哪调用。 ③ this指向的对象,我们称之为函数的上下文context,也叫函数的调用者 2、※※※※※this指向的规律(与函数调用的方式息息相关): this指向的情况,取决于函数调用的方式有哪些: ① 通过函数名()直接调用:this指向window ② 通过对象.函数名()调用的:this指向这个对象 ③ 函数作为数组的一个元素,通过数组下标调用的:this指向这个数组 ④ 函数作为window内置函数的回调函数调用:this指向window setInterval setTimeout 等... ⑤ 函数作为构造函数,用new关键字调用时:this指向新new出的对象 function func(){ console.log(this); } ① 通过函数名()直接调用:this指向window func(); this--->window ② 通过对象.函数名()调用的:this指向这个对象 狭义对象 var obj = { name:"obj", func1 :func }; obj.func1(); this--->obj 广义对象 document.getElementById("div")

Javascript函数调用的四种模式

匆匆过客 提交于 2020-02-08 03:22:22
  一  前言   Javascript一共有四种调用模式:方法调用模式、函数调用模式、构造器调用模式以及apply调用模式。调用模式不同,对应的隐藏参数this值也会不同。   二  方法调用模式   函数作为对象的属性时,称为方法。此时函数(即方法)中的this对应是该对象。 var myObject = {   value:3,  func:function(){    alert(this.value);  }   };// 方法调用模式,this对应的是myObject对象myObject.func();  //3   也可以写成如下格式: var myObject = { value:3 }; myObject.func = function() { alert(this.value); }// 方法调用模式myObject.func();  //3   上面,this对应的是myObject对象。   三  函数调用模式   函数调用模式即通常的函数调用,属于全局性调用,此时this对应的是全局对象,即Window对象。 var add = function(a, b) { return a + b; } // 函数调用模式 add(3,4); //7   上面也可以写成 window.add = function(a, b) { return a + b; }//

python中函数和方法的区别

我的梦境 提交于 2020-02-08 01:37:51
本篇内容主要介绍从几个维度来介绍下python中函数和方法的区别: 首先,从分类的角度来分析。 (1)函数的分类: 内置函数:python内嵌的一些函数。 匿名函数:一行代码实现一个函数功能。 递归函数 自定义函数:根据自己的需求,来进行定义函数。 (2)方法的分类: 普通方法:直接用self调用的方法。 私有方法:__函数名,只能在类中被调用的方法。 属性方法:@property,将方法伪装成为属性,让代码看起来更合理。 特殊方法(双下划线方法):以__init__为例,是用来封装实例化对象的属性, 只要是实例化对象就一定会执行__init方法 ,如果对象子类中没有则会寻找父类(超类),如果父类(超类)也没有,则直接继承object(python 3.x)类,执行类中的__init__方法。 类方法:通过类名的调用去操作公共模板中的属性和方法。 静态方法:不用传入类空间、对象的方法, 作用是保证代码的一致性,规范性,可以完全独立类外的一个方法,但是为了代码的一致性统一的放到某个模块(py文件)中。 其次,从作用域的角度来分析: (1)函数作用域:从函数调用开始至函数执行完成,返回给调用者后,在执行过程中开辟的空间 会自动释放 ,也就是说函数执行完成后,函数体内部通过赋值等方式修改变量的值不会保留,会随着返回给调用者后,开辟的空间会自动释放。 (2)方法作用域

网络编程并发编程面试题

泄露秘密 提交于 2020-02-07 23:47:48
网络编程,并发编程 面试题1. 简述 OSI 七层协议。应用层与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序员就需要实现OSI的第7层。示例:TELNET,HTTP,FTP,NFS,SMTP等。表示层这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。会话层它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。传输层这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。网络层这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址

C++异常机制的分析

岁酱吖の 提交于 2020-02-07 22:02:39
找了很多资料发现这一篇文章写的最好,转载以下: https://blog.csdn.net/cqu20093154/article/details/44020043 ................................................................................................................................................................................... 进程和线程的概念相信各位看官早已耳熟能详。在这里,我只想带大家回忆几点重要概念: 一个进程中可以同时包含多个线程。 我们通常认为线程是操作系统可识别的最小并发执行和调度单位(不要跟俺说还有 Green Thread 或者 Fiber,OS Kernel 不认识也不参与这些物件的调度)。 同一进程中的多个线程共享代码段(代码和常量)、数据段(静态和全局变量)和扩展段(堆存储),但是每个线程有自己的栈段。栈段又叫运行时栈,用来存放所有局部变量和临时变量(参数、返回值、临时构造的变量等)。这一条对下文中的某些概念来说是非常重要的 。但是请注意,这里提到的各个“段”都是逻辑上的说法,在物理上某些硬件架构或者操作系统可能不使用段式存储。不过没关系