CN112882695B - 传参方法、装置、计算机设备及存储介质 - Google Patents
传参方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN112882695B CN112882695B CN202110232129.5A CN202110232129A CN112882695B CN 112882695 B CN112882695 B CN 112882695B CN 202110232129 A CN202110232129 A CN 202110232129A CN 112882695 B CN112882695 B CN 112882695B
- Authority
- CN
- China
- Prior art keywords
- function
- stack
- stack frame
- parameter
- parameters
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 67
- 230000005540 biological transmission Effects 0.000 title claims abstract description 39
- 230000006870 function Effects 0.000 claims abstract description 318
- 230000004044 response Effects 0.000 claims abstract description 6
- 230000009191 jumping Effects 0.000 claims description 13
- 238000005457 optimization Methods 0.000 claims description 10
- 235000008694 Humulus lupulus Nutrition 0.000 claims description 6
- 238000010586 diagram Methods 0.000 description 6
- 238000004590 computer program Methods 0.000 description 5
- VOZKAJLKRJDJLL-UHFFFAOYSA-N 2,4-diaminotoluene Chemical compound CC1=CC=C(N)C=C1N VOZKAJLKRJDJLL-UHFFFAOYSA-N 0.000 description 4
- 238000012544 monitoring process Methods 0.000 description 3
- 238000011084 recovery Methods 0.000 description 3
- WZCQRUWWHSTZEM-UHFFFAOYSA-N 1,3-phenylenediamine Chemical compound NC1=CC=CC(N)=C1 WZCQRUWWHSTZEM-UHFFFAOYSA-N 0.000 description 2
- 206010000060 Abdominal distension Diseases 0.000 description 1
- 208000024330 bloating Diseases 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000003068 static effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
- G06F8/315—Object-oriented languages
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/20—Software design
- G06F8/24—Object-oriented
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/37—Compiler construction; Parser generation
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computing Systems (AREA)
- Stored Programmes (AREA)
- Executing Machine-Instructions (AREA)
Abstract
本申请实施例公开了一种传参方法、装置、计算机设备及存储介质,属于编程技术领域。该方法包括:响应于第一函数生成待传递参数,通过第一函数将待传递参数写入第一栈帧,第一栈帧为第一函数对应的栈帧;通过第一函数调用第i函数,其中,第一函数调用第i函数时经过i‑1层调用,i为大于等于2的整数;通过第i函数从第一栈帧中读取待传递参数。本申请实施例中,利用栈帧实现传参,函数中无需设置预留参数,避免函数由不同开发者编写时,因未在函数中设置预留参数导致传参失败的问题,提高了传参的成功率,并有助于简化函数代码,降低运行过程中的内存开销。
Description
技术领域
本申请实施例涉及编程技术领域,特别涉及一种传参方法、装置、计算机设备及存储介质。
背景技术
传参是一种通过调用在函数之间实现参数传递的过程。
为了保证正常传参,进行传参的函数中需要设置预留参数。比如,当A函数需要通过B函数,将生成的参数a传递给C函数时,B函数和C函数中均需要设置预留参数用于传递参数a。
然而,由于不同函数可能由不同开发者编写,因此无法保证函数中均设置预留参数,且在函数中设置预留参数会造成代码臃肿,增加运行过程中的内存开销。
发明内容
本申请实施例提供了一种传参方法、装置、计算机设备及存储介质。所述技术方案如下:
一方面,本申请实施例提供了一种传参方法,所述方法包括:
响应于第一函数生成待传递参数,通过所述第一函数将所述待传递参数写入第一栈帧,所述第一栈帧为所述第一函数对应的栈帧;
通过所述第一函数调用第i函数,其中,所述第一函数调用所述第i函数时经过i-1层调用,i为大于等于2的整数;
通过所述第i函数从所述第一栈帧中读取所述待传递参数。
另一方面,本申请实施例提供了一种传参装置,所述装置包括:
参数写入模块,用于响应于第一函数生成待传递参数,通过所述第一函数将所述待传递参数写入第一栈帧,所述第一栈帧为所述第一函数对应的栈帧;
调用模块,用于通过所述第一函数调用第i函数,其中,所述第一函数调用所述第i函数时经过i-1层调用,i为大于等于2的整数;
参数读取模块,用于通过所述第i函数从所述第一栈帧中读取所述待传递参数。
另一方面,本申请实施例提供了一种计算机设备,所述计算机设备包括处理器和存储器;所述存储器存储有至少一条指令,所述至少一条指令用于被所述处理器执行以实现如上述方面所述的传参方法。
另一方面,本申请实施例提供了一种计算机可读存储介质,所述存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现如上述方面所述的传参方法。
另一方面,本申请实施例提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面提供的传参方法。
本申请实施例中,当第一函数生成需要传递至第i函数的待传递参数后,通过将待传递参数写入第一函数对应的第一栈帧,使得第一函数逐层调用第i函数后,第i函数能够从第一栈帧中读取该待传递参数,实现第一函数与第i函数之间的传参;利用栈帧实现传参,函数中无需设置预留参数,避免函数由不同开发者编写时,因未在函数中设置预留参数导致传参失败的问题,提高了传参的成功率,并有助于简化函数代码,降低运行过程中的内存开销。
附图说明
图1是采用设置预留参数方式实现函数间传参的实施示意图;
图2是本申请一个示例性实施例提供传参方法实施过程的实施示意图;
图3示出了本申请一个示例性实施例提供的传参方法的流程图;
图4示出了本申请另一个示例性实施例提供的传参方法的流程图;
图5是本申请一个示例性实施例示出的待传递参数写入过程的实施示意图;
图6是本申请一个示例性实施例示出的待传递参数读取过程的实施示意图;
图7是本申请一个示例性实施例示出的栈帧恢复过程的实施示意图;
图8是本申请一个示例性实施例提供的编译前后的代码片段;
图9示出了本申请一个示例性实施例提供的传参装置的结构方框图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请实施方式作进一步地详细描述。
在本文中提及的“多个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,同时存在A和B,单独存在B这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
为了方便理解,下面对本申请实施例中涉及的名词进行说明。
栈帧(Stack Frame):函数在整个栈中的一个片段,每一次函数的调用,都会在调用栈(call stack)上维护一个独立的栈帧,每个独立的栈帧一般包括:函数的返回地址和返回变量、临时变量(包括函数的非静态局部变量以及编译器自动生成的临时变量)以及函数调用的上下文。其中,栈帧对应有栈顶指针(stack pointer)寄存器(esp或rsp)以及栈底指针(base pointer)寄存器(ebp或rbp),栈顶指针寄存器是指向栈顶的寄存器,栈底指针寄存器则是指向栈底的寄存器。
内联优化:将编程语言转化为汇编语言的过程中,编译器会自动对代码进行优化,优化后代码与优化前代码的效果相同,但是优化代码更加精简,执行速度更快。
如图1所示,采用设置预留参数的方式实现函数间传参时,若A函数需要通过调用B函数向C函数传递生成的参数a时,传参过程包括如下步骤:
1、A函数生成参数a;
2、A函数将参数a传递至B函数;
3、B函数将参数a传递至C函数。
显然,为了保证参数的正确传递,B函数和C函数中均需要设置预留参数(aint),从而通过该预留参数传递参数a。
在一种可能的场景下,A函数由开发人员甲编写,B函数由开发人员乙编写,而函数C由开发人员丙编写。当开发人员甲希望监控A函数到C函数的耗时时,A函数需要将时间参数通过B函数传递给C函数,以便C函数基于该时间参数计算得到耗时。为此,开发人员乙和开发人员丙分别需要在B函数和C函数中设置用于传递该时间参数的预留参数,否则时间参数将无法传递。在B函数被封装接口形成库的情况下,开发人员乙修改函数代码的成本较高,且会对原先的函数代码造成侵入,使函数代码过于臃肿(因为每个传递的参数都需要设置相应的预留参数)。
而采用本申请实施例提供的方案实现函数间传参时,如图2所示,传参过程包括如下步骤:
1、A函数生成参数a;
2、A函数将参数a写入函数的栈帧;
3、A函数调用B函数,调用过程中不传递参数a;
4、B函数调用C函数,调用过程中不传递参数a;
5、C函数从A函数的栈帧中读取参数a。
由于A函数调用B函数,以及B函数调用C函数的过程中,均不需要传递参数a,因此B函数和C函数中无需额外设置预留参数用于传递参数a;并且A函数将参数a写入栈帧后,C函数通过栈帧能够读取到需要传递的参数a,保证函数之间参数中的正确传递。在B函数被封装接口形成库的情况下,开发人员乙无需修改函数代码,避免对原先的函数代码造成侵入。
本申请实施例提供的传参方法,可以应用于具有程序执行功能的计算机设备,该计算机设备可以是智能手机、平板电脑、可穿戴式设备、个人计算机或服务器等等,为了方便表述,下述各个实施例以传参方法用于计算机设备进行说明,但并不对此构成限定。
请参考图3,其示出了本申请一个示例性实施例提供的传参方法的流程图。该方法可以包括如下步骤:
步骤301,响应于第一函数生成待传递参数,通过第一函数将待传递参数写入第一栈帧,第一栈帧为第一函数对应的栈帧。
由于各个函数对应有各自的栈帧,因此本申请实施例中利用栈帧进行参数传递,无需在函数中设置预留参数用以传递参数。当第一函数需要将生成的参数传递给其它函数时,第一函数即将该参数写入自身对应的第一栈帧中,实现隐式埋点,以便后续其它函数从该埋点中读取写入的参数。
其中,该待传递参数可以是整型参数、浮点型参数字符串等等,本申请实施例并不对待传递参数的具体类型以及用途进行限定。
在一种可能的实施方式中,第一函数将待传递参数写入第一栈帧中的指定位置,该指定位置处的参数在内联优化过程中(即编译过程中)不会被覆盖,从而保证参数传递的准确性。
步骤302,通过第一函数调用第i函数,其中,第一函数调用第i函数时经过i-1层调用,i为大于等于2的整数。
本申请实施例中,当第一函数需要将待传递参数传输至第i函数时,采用函数调用的方式逐层调用,直至调用至第i函数,其中,从第一函数调用至第i函数过程中,共需要经过i-1层调用,分别为第一函数调用第二函数,第二函数调用第三函数,…,第i-1函数调用第i函数。
示意性的,如图2所示,当A函数(第一函数)需要通过B函数(第二函数)向C函数(第三函数)传递参数a时,从第一函数调用至第三函数过程中共需要经过2层调用,分别为A函数调用B函数,以及B函数调用C函数。
当然,第一函数也可以通过一次或两次以上调用过程调用第i函数,本申请实施例并不对函数调用的层数进行限定。
在一种可能的实施方式中,第一函数至第i函数采用相同编程语言编写得到,该编程语言可以为Go(Golang)语言。其中,Go语言是一种基于协程的语言,协程远比线程要轻便,一条协程的开销通常只有线程的几十分之一,因此协程内部字段会非常的精简,不像线程一样拥有ThreadLocal(线程内部的存储,可以将内容传递到线程执行的每一个函数中,但是会增加内存开销,与协程的设置初衷相悖)可以用来传递参数给整个调用栈,相应的,相关技术中,采用Go语言编写的函数无法通过ThreadLocal进行传参,需要通过设置预留参数进行传参。由于待传递参数被写入栈帧中,因此不会存在并发问题,与ThreadLocal具备类似的属性,而无需Go的协程做出牺牲。在一些调用链监控中,可以在不侵入代码的前提下实现整条调用链的监控,给链路监控带来极大遍历。
需要说明的是,第一函数至第i函数除了能够采用Go语言编写外,还可以采用其他编程语言编写(同样采用预留参数进行传参),本申请实施例并不对函数采用的编程语言构成限定。
步骤303,通过第i函数从第一栈帧中读取待传递参数。
在一种可能的实施方式中,第i函数被第一函数逐层调用后,可以从自身对应的栈帧(即第i栈帧)回跳至第一栈帧,进而从第一栈帧中读取写入的待传递参数,实现整个传参流程。
其中,第i函数从第一栈帧中的指定位置读取该待传递参数。
综上所述,本申请实施例中,当第一函数生成需要传递至第i函数的待传递参数后,通过将待传递参数写入第一函数对应的第一栈帧,使得第一函数逐层调用第i函数后,第i函数能够从第一栈帧中读取该待传递参数,实现第一函数与第i函数之间的传参;利用栈帧实现传参,函数中无需设置预留参数,避免函数由不同开发者编写时,因未在函数中设置预留参数导致传参失败的问题,提高了传参的成功率,并有助于简化函数代码,降低运行过程中的内存开销。
请参考图4,其示出了本申请另一个示例性实施例提供的传参方法的流程图。该方法可以包括如下步骤:
步骤401,响应于第一函数生成待传递参数,通过在第一函数处执行汇编指令,将待传递参数写入第一栈帧的栈底,其中,内联优化过程中栈底内的参数不会被覆盖。
在一种可能的实施方式中,计算机设备通过在第一函数处执行汇编指令,将待传递参数写入第一栈帧的指定位置。
关于待传递参数的具体写入位置,由于栈帧中栈底内的参数用于指示上一跳栈帧中栈底的地址,因此栈底内的参数在内联优化过程中不会被覆盖(栈帧内其他位置处的参数在内联优化过程中随时都会被覆盖),相应的,为了保证参数传递的准确性,避免因内联优化导致待传递参数被更改,待传递参数被写入第一栈帧的栈底。
并且,由于第一栈帧中栈底内原先写入有参数,因此为了保证待传递参数被正确写入,且不破坏第一栈帧的结构,计算机设备首先需要对第一栈帧中栈底内的原始参数进行临时保存(以便调用结束后续恢复第一栈帧的结构),再将待传递参数写入第一栈帧的栈底。可选的,本步骤可以包括如下子步骤。
一、通过在第一函数处执行汇编指令,将第一栈帧中栈底内的原始参数保存至第一函数的返回变量。
在一种可能的实施方式中,为了避免因向第一栈帧的栈底内写入待传递参数,导致栈底内的原始参数丢失,在写入待传递参数前,计算机设备首先通过在第一函数处执行汇编指令,将第一栈帧中栈底内的原始参数保存至第一函数的返回变量(FP)。
示意性的,如图5所示,A函数对应的第一栈帧中,栈底的地址为0x0e0,且栈底内的原始参数为0x100(指示上一跳栈帧的栈底地址),当待传递参数为0x001时,计算机设备首先在A函数处执行汇编指令“MOVQ BP,AX”,将栈底内的原始参数0x100(RBP(0x0e0)=0x100)赋值到加法(AX,Accumulator)寄存器(RAX)中,并进一步执行汇编指令“MOVQ AX,FP”将RAX中寄存的原始参数赋值给A函数的返回变量(FP)。
当然,除了利用RAX作为中转保存原始参数外,计算机设备还可以使用其他寄存器作为中转保存原始参数,本实施例对此不作限定。
二、通过在第一函数处执行汇编指令,将第一栈帧中栈底内的原始参数替换为待传递参数。
由于栈底内的原始参数已经被临时保存在第一函数的返回变量中,因此计算机设备可以进一步执行汇编指令,将栈底内的原始参数替换为待传递参数,完整待传递参数的隐式埋点。
示意性的,如图5所示,计算机设备在A函数处执行汇编指令“MOVQ 0x001,BP”,将栈底内的原始参数0x100(RBP(0x0e0)=0x100)替换为待传递参数0x001。完成上述原始参数保存以及待传递参数写入后,A函数对应第一栈帧中,栈底内的参数由0x100变更为0x001。
步骤402,通过第一函数调用第i函数,其中,第一函数调用第i函数时经过i-1层调用,i为大于等于2的整数。
本步骤的实施方式可以参考步骤302,本实施例在此不再赘述。
结合上述步骤的示例,当A函数需要将生成的参数0x001传递至C函数时,A函数首先调用B函数,再由B函数调用C函数,即A函数通过两层调用,调用到C函数。
步骤403,通过在第i函数处执行汇编指令,从第一栈帧的栈底中读取待传递参数。
相应的,由于待传递参数被写入了第一栈帧的栈底,因此计算机设备需要从第一栈帧的栈底读取该待传递参数,从而实现传参。并且,由于当前调用了第i函数,因此计算机设备通过栈帧回跳的方式,回跳至第一栈帧的栈底,从而读取待传递参数。可选的,本步骤可以包括如下子步骤。
一、通过在第i函数处执行汇编指令,从第i栈帧的栈底回跳至第一栈帧的栈底,第i栈帧为第i函数对应的栈帧,且从第i栈帧的栈底至第一栈帧的栈底经过i-1次回跳。
调用第i函数后,由于当前位于第i函数对应的第i栈帧,而待传递参数位于第一栈帧,因此计算机设备首先在第i函数处执行汇编指令,从第i栈帧的栈底回跳至第一栈帧的栈底。
由于当前栈帧的栈底内存储有上一跳栈帧的栈底地址,因此可以通过执行汇编指令,从当前栈帧的栈底内获取上一跳栈帧的栈底地址,从而基于该栈底地址回跳至上一跳栈帧的栈底,通过多次回跳最终回跳至第一栈帧的栈底。
对于调用链(第一函数至第i函数)中第二函数至第i函数中任一函数对应的栈帧,栈帧的回跳过程可以包括如下步骤。
1、从第k栈帧的栈底中读取第k参数,第k参数用于指示第k-1栈帧中栈底的地址,第k栈帧为第k函数对应的栈帧,第k-1栈帧为第k-1函数对应的栈帧,k为大于1且小于等于i的整数。
若当前位于第k函数对应的第k栈帧,计算机设备通过执行汇编指令,从第k栈帧的栈底中读取第k参数,从而基于第k参数确定第k-1函数(第k-1函数调用第k函数)对应第k-1栈帧的栈底地址。
延续上述步骤中的示例,如图6所示,若当前位于C函数对应的第三栈帧,计算机设备通过执行汇编指令“MOVQ(BP),AX”将第三栈帧中栈底(地址为0x040)内的参数0x090存储至RAX中。
2、基于第k参数,回跳至第k-1栈帧的栈底。
由于第k参数用于指示第k栈帧的栈底地址,因此计算机设备能够基于第k参数,执行一次栈帧回跳(即回跳至第k参数指示的地址),回跳至第k-1栈帧的栈底。
示意性的,如图6所示,计算机设备基于RAX中存储的参数0x090,回跳至B函数对应第二栈帧的栈底(地址为0x090)。
进一步的,计算机设备从第k-1栈帧的栈底中读取第k-1参数,第k-1参数用于指示第k-2栈帧中栈底的地址,从而基于第k-1参数回跳至第k-2栈帧的栈底。
示意性的,如图6所示,回跳至B函数对应第二栈帧的栈底后,计算机设备通过执行汇编指令“MOVQ(AX),AX”,将RAX中存储的参数0x090更新为第二栈帧中栈底(地址为0x090)内的参数0x0e0,从而基于RAX中存储的参数0x0e0,回跳至A函数对应第一栈帧的栈底(地址为0x0e0)。
二、将经过i-1次回跳后,从栈底读取到的参数确定为待传递参数。
由于第一函数与第i函数之间经过了i-1层调用,因此在进行i-1次回跳后,即完成从第i栈帧的栈底回跳至第一栈帧的栈底。相应的,计算机设备将经过i-1次回跳后,从栈底读取到的参数确定为待传递参数。
示意性的,如图6所示,由A函数与C函数之间经过了2层调用,因此在进行2次回跳后,即回跳至A函数对应第一栈帧的栈底,进而通过执行汇编指令“MOVQ(AX),AX”,将RAX中存储的参数0x0e0更新为第一栈帧中栈底(地址为0x0e0)内的参数0x001,并将RAX中存储的参数0x001确定为待传递参数。
通过上述步骤,A函数通过逐层调用,利用栈帧内埋点的方式将待传递参数传递至C函数,对函数代码无侵入,且每次回跳至上一栈帧时只需要执行一个汇编指令即可,与传统的利用预留参数传参的性能几乎一致,但节省了栈帧的长度空间(因为设置的预留参数会被压入栈帧中)。并且,开发人员可以根据需求,有选择的在栈帧内设置埋点,灵活性较高。
由于向第一栈帧的栈底中写入待传递参数时,改变了第一栈帧的结构,因此为了保证结束调用后,第一函数仍旧能够正常运行,计算机设备需要对第一栈帧的结构进行恢复(步骤404)。
步骤404,响应于调用结束,通过第一函数恢复第一栈帧,其中,恢复后第一栈帧中不包含待传递参数。
调用链结束后,计算机设备恢复第一函数对应的第一栈帧,使恢复后的第一栈帧与写入待传递参数前的第一栈帧保持一致(即恢复后的第一栈帧中不再包含待传递参数)。
在一种可能的实施方式中,当待传递参数写入第一栈帧的栈底,且第一栈帧中栈底内的原始参数保存在第一函数的返回变量时,计算机设备通过在第一函数处执行汇编指令,将第一栈帧中栈底内的待传递参数替换为第一函数的返回变量。
延续上述步骤中的示例,如图5和7所示,在写入待传递参数0x001前,由于第一栈帧中栈底内的原始参数0x100被保存在A函数的返回变量(FP)中,因此结束调用后,计算机设备可以在第一函数处执行汇编指令“MOVQ FP,BP”,将返回变量中保存的原始参数0x100重新写入第一栈帧的栈底。
在一个示意性的例子中,当采用Go语言编写函数时,编译前后传参过程涉及的代码如图8所示。其中,SetRbp用于将待传递参数(括号中的参数2指示待传递参数为1)写入A函数对应栈帧的栈底,并返回栈底的地址;BackRbp用于还原A函数对应栈帧中栈底内的原始参数;GetBackRbp(括号中的参数2指示回跳两次)则用于回跳至A函数对应栈帧的栈底,并读取栈底内写入的待传递参数。
通过上述步骤,调用过程中,A函数生成的待传递参数被传递至C函数,调用结束后,A函数对应栈帧的结构恢复至调用前,从而保证调用结束后函数的正常执行。
本实施例中,计算机设备通过执行汇编指令,采用栈帧回跳的方式,从第i栈帧的栈底回跳至第一栈帧的栈底,从而读取到第一栈帧的栈底内写入的待传递参数,在无需设置预留参数的前提下,提高了传参性能,并降低栈帧占用的控件。
此外,本实施例中,通过将待传递参数写入栈帧的栈底,避免内联优化过程中待传递参数发生变更,保证传参准确性;同时,将栈底中的原始参数临时保存在函数的返回变量,并在结束调用后,将返回变量中保存的原始参数重新写回栈底,保证后续函数的正常执行。
请参考图9,其示出了本申请一个示例性实施例提供的传参装置的结构方框图。该装置可以包括:
参数写入模块901,用于响应于第一函数生成待传递参数,通过所述第一函数将所述待传递参数写入第一栈帧,所述第一栈帧为所述第一函数对应的栈帧;
调用模块902,用于通过所述第一函数调用第i函数,其中,所述第一函数调用所述第i函数时经过i-1层调用,i为大于等于2的整数;
参数读取模块903,用于通过所述第i函数从所述第一栈帧中读取所述待传递参数。
可选的,参数写入模块901,用于:
通过在所述第一函数处执行汇编指令,将所述待传递参数写入所述第一栈帧的栈底,其中,内联优化过程中栈底内的参数不会被覆盖;
参数读取模块903,用于:
通过在所述第i函数处执行汇编指令,从所述第一栈帧的栈底中读取所述待传递参数。
可选的,参数写入模块901,包括:
保存单元,用于通过在所述第一函数处执行汇编指令,将所述第一栈帧中栈底内的原始参数保存至所述第一函数的返回变量;
写入单元,用于通过在所述第一函数处执行汇编指令,将所述第一栈帧中栈底内的所述原始参数替换为所述待传递参数。
可选的,参数读取模块903,包括:
回跳单元,用于通过在所述第i函数处执行汇编指令,从第i栈帧的栈底回跳至所述第一栈帧的栈底,所述第i栈帧为所述第i函数对应的栈帧,且从所述第i栈帧的栈底至所述第一栈帧的栈底经过i-1次回跳;
读取单元,用于将经过i-1次回跳后,从栈底读取到的参数确定为所述待传递参数。
可选的,回跳单元,具体用于:
从第k栈帧的栈底中读取第k参数,所述第k参数用于指示第k-1栈帧中栈底的地址,所述第k栈帧为第k函数对应的栈帧,所述第k-1栈帧为第k-1函数对应的栈帧,k为大于1且小于等于i的整数;
基于所述第k参数,回跳至所述第k-1栈帧的栈底。
可选的,所述栈帧还包括:
恢复模块,用于响应于调用结束,通过所述第一函数恢复所述第一栈帧,其中,恢复后所述第一栈帧中不包含所述待传递参数。
可选的,所述待传递参数写入所述第一栈帧的栈底,且所述第一栈帧中栈底内的原始参数保存在所述第一函数的返回变量;
恢复模块,具体用于:
通过在所述第一函数处执行汇编指令,将所述第一栈帧中栈底内的所述待传递参数替换为所述第一函数的返回变量。
可选的,所述第一函数至所述第i函数是Go语言编写的函数。
综上所述,本申请实施例中,当第一函数生成需要传递至第i函数的待传递参数后,通过将待传递参数写入第一函数对应的第一栈帧,使得第一函数逐层调用第i函数后,第i函数能够从第一栈帧中读取该待传递参数,实现第一函数与第i函数之间的传参;利用栈帧实现传参,函数中无需设置预留参数,避免函数由不同开发者编写时,因未在函数中设置预留参数导致传参失败的问题,提高了传参的成功率,并有助于简化函数代码,降低运行过程中的内存开销。
本实施例中,计算机设备通过执行汇编指令,采用栈帧回跳的方式,从第i栈帧的栈底回跳至第一栈帧的栈底,从而读取到第一栈帧的栈底内写入的待传递参数,在无需设置预留参数的前提下,提高了传参性能,并降低栈帧占用的控件。
此外,本实施例中,通过将待传递参数写入栈帧的栈底,避免内联优化过程中待传递参数发生变更,保证传参准确性;同时,将栈底中的原始参数临时保存在函数的返回变量,并在结束调用后,将返回变量中保存的原始参数重新写回栈底,保证后续函数的正常执行。
需要说明的是:上述实施例提供的装置在实现其功能时,仅以上述各功能模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能模块完成,即将装置的内部结构划分成不同的功能模块,以完成以上描述的全部或者部分功能。另外,上述实施例提供的装置与方法实施例属于同一构思,其具体实现过程详见方法实施例,这里不再赘述。
本申请实施例还提供了一种计算机设备,计算机设备包括处理器和存储器,存储器存储有至少一条指令,至少一条指令用于被处理器执行以实现如上各个实施例所述的传参方法。
本申请实施例还提供了一种计算机可读存储介质,该计算机可读存储介质存储有至少一条指令,至少一条指令由处理器加载并执行以实现如上各个实施例所述的传参方法。
本申请实施例还提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述方面的各种可选实现方式中提供的传参方法。
本领域技术人员应该可以意识到,在上述一个或多个示例中,本申请实施例所描述的功能可以用硬件、软件、固件或它们的任意组合来实现。当使用软件实现时,可以将这些功能存储在计算机可读存储介质中或者作为计算机可读存储介质上的一个或多个指令或代码进行传输。计算机可读存储介质包括计算机存储介质和通信介质,其中通信介质包括便于从一个地方向另一个地方传送计算机程序的任何介质。存储介质可以是通用或专用计算机能够存取的任何可用介质。
以上所述仅为本申请的可选实施例,并不用以限制本申请,凡在本申请的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本申请的保护范围之内。
Claims (8)
1.一种传参方法,其特征在于,所述方法包括:
响应于第一函数生成待传递参数,通过在所述第一函数处执行汇编指令,将第一栈帧中栈底内的原始参数保存至所述第一函数的返回变量,所述第一栈帧为所述第一函数对应的栈帧;
通过在所述第一函数处执行汇编指令,将所述第一栈帧中栈底内的所述原始参数替换为所述待传递参数,其中,内联优化过程中栈底内的参数不会被覆盖;
通过所述第一函数调用第i函数,其中,所述第一函数调用所述第i函数时经过i-1层调用,i为大于等于2的整数;
通过在所述第i函数处执行汇编指令,从第i栈帧的栈底回跳至所述第一栈帧的栈底,所述第i栈帧为所述第i函数对应的栈帧,且从所述第i栈帧的栈底至所述第一栈帧的栈底经过i-1次回跳;
将经过i-1次回跳后,从栈底读取到的参数确定为所述待传递参数。
2.根据权利要求1所述的方法,其特征在于,所述从第i栈帧的栈底回跳至所述第一栈帧的栈底,包括:
从第k栈帧的栈底中读取第k参数,所述第k参数用于指示第k-1栈帧中栈底的地址,所述第k栈帧为第k函数对应的栈帧,所述第k-1栈帧为第k-1函数对应的栈帧,k为大于1且小于等于i的整数;
基于所述第k参数,回跳至所述第k-1栈帧的栈底。
3.根据权利要求1至2任一所述的方法,其特征在于,所述通过在所述第i函数处执行汇编指令,从第i栈帧的栈底回跳至所述第一栈帧的栈底之后,所述方法还包括:
响应于调用结束,通过所述第一函数恢复所述第一栈帧,其中,恢复后所述第一栈帧中不包含所述待传递参数。
4.根据权利要求3所述的方法,其特征在于,所述待传递参数写入所述第一栈帧的栈底,且所述第一栈帧中栈底内的原始参数保存在所述第一函数的返回变量;
所述通过所述第一函数恢复所述第一栈帧,包括:
通过在所述第一函数处执行汇编指令,将所述第一栈帧中栈底内的所述待传递参数替换为所述第一函数的返回变量。
5.根据权利要求1至2任一所述的方法,其特征在于,所述第一函数至所述第i函数是Go语言编写的函数。
6.一种传参装置,其特征在于,所述装置包括:
参数写入模块,用于响应于第一函数生成待传递参数,通过在所述第一函数处执行汇编指令,将第一栈帧中栈底内的原始参数保存至所述第一函数的返回变量,所述第一栈帧为所述第一函数对应的栈帧;
调用模块,用于通过所述第一函数调用第i函数,其中,所述第一函数调用所述第i函数时经过i-1层调用,i为大于等于2的整数;
参数读取模块,用于通过在所述第i函数处执行汇编指令,从第i栈帧的栈底回跳至所述第一栈帧的栈底,所述第i栈帧为所述第i函数对应的栈帧,且从所述第i栈帧的栈底至所述第一栈帧的栈底经过i-1次回跳;将经过i-1次回跳后,从栈底读取到的参数确定为所述待传递参数。
7.一种计算机设备,其特征在于,所述计算机设备包括处理器和存储器;所述存储器存储有至少一条指令,所述至少一条指令用于被所述处理器执行以实现如权利要求1至5任一所述的传参方法。
8.一种计算机可读存储介质,其特征在于,所述存储介质存储有至少一条指令,所述至少一条指令用于被处理器执行以实现如权利要求1至5任一所述的传参方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110232129.5A CN112882695B (zh) | 2021-03-02 | 2021-03-02 | 传参方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110232129.5A CN112882695B (zh) | 2021-03-02 | 2021-03-02 | 传参方法、装置、计算机设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112882695A CN112882695A (zh) | 2021-06-01 |
CN112882695B true CN112882695B (zh) | 2023-11-28 |
Family
ID=76055242
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110232129.5A Active CN112882695B (zh) | 2021-03-02 | 2021-03-02 | 传参方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112882695B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113360419B (zh) * | 2021-08-11 | 2022-06-07 | 云智慧(北京)科技有限公司 | 一种应用的数据处理方法、装置及设备 |
CN115774583A (zh) * | 2021-09-08 | 2023-03-10 | 华为技术有限公司 | 程序调用栈创建方法、栈回溯方法和装置 |
Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
KR20000032612A (ko) * | 1998-11-16 | 2000-06-15 | 이계철 | 칠 컴파일러의 실행시간 스택프레임 구성 방법 |
US6108715A (en) * | 1994-12-13 | 2000-08-22 | Microsoft Corporation | Method and system for invoking remote procedure calls |
CN101539883A (zh) * | 2009-05-05 | 2009-09-23 | 北京和利时系统工程有限公司 | 嵌入式系统的错误追踪方法和装置 |
CN103106097A (zh) * | 2013-03-12 | 2013-05-15 | 无锡江南计算技术研究所 | 一种即时编译系统中的栈运算优化方法 |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
CN103942083A (zh) * | 2014-04-28 | 2014-07-23 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
CN104536722A (zh) * | 2014-12-23 | 2015-04-22 | 大唐移动通信设备有限公司 | 基于业务处理流程的栈空间优化方法和系统 |
CN104598809A (zh) * | 2015-02-13 | 2015-05-06 | 北京奇虎科技有限公司 | 程序的监控方法及其防御方法以及相关装置 |
CN106227671A (zh) * | 2016-08-05 | 2016-12-14 | 网易(杭州)网络有限公司 | 程序运行性能分析方法及装置 |
CN106802785A (zh) * | 2016-12-13 | 2017-06-06 | 北京华为数字技术有限公司 | 一种栈解析方法和装置 |
CN107291480A (zh) * | 2017-08-15 | 2017-10-24 | 中国农业银行股份有限公司 | 一种函数调用方法及装置 |
CN110245027A (zh) * | 2018-09-21 | 2019-09-17 | 浙江大华技术股份有限公司 | 一种进程间通信的方法和设备 |
CN112306473A (zh) * | 2020-10-27 | 2021-02-02 | 深圳市元征科技股份有限公司 | 一种程序接口传参方法、系统及相关设备 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7356812B2 (en) * | 2003-09-30 | 2008-04-08 | Intel Corporation | Passing parameters by implicit reference |
US9557917B2 (en) * | 2014-11-10 | 2017-01-31 | International Business Machines Corporation | Conditional stack frame allocation |
US11294682B2 (en) * | 2019-05-20 | 2022-04-05 | Microsoft Technology Licensing, Llc | Stack traces using shadow stack |
-
2021
- 2021-03-02 CN CN202110232129.5A patent/CN112882695B/zh active Active
Patent Citations (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6108715A (en) * | 1994-12-13 | 2000-08-22 | Microsoft Corporation | Method and system for invoking remote procedure calls |
KR20000032612A (ko) * | 1998-11-16 | 2000-06-15 | 이계철 | 칠 컴파일러의 실행시간 스택프레임 구성 방법 |
CN101539883A (zh) * | 2009-05-05 | 2009-09-23 | 北京和利时系统工程有限公司 | 嵌入式系统的错误追踪方法和装置 |
CN103106097A (zh) * | 2013-03-12 | 2013-05-15 | 无锡江南计算技术研究所 | 一种即时编译系统中的栈运算优化方法 |
CN103870767A (zh) * | 2014-03-19 | 2014-06-18 | 四川大学 | 基于ebp构造的栈栈帧内容保护方法 |
CN103942083A (zh) * | 2014-04-28 | 2014-07-23 | 中国人民解放军国防科学技术大学 | 一种面向可变参函数的编译实现方法 |
CN104536722A (zh) * | 2014-12-23 | 2015-04-22 | 大唐移动通信设备有限公司 | 基于业务处理流程的栈空间优化方法和系统 |
CN104598809A (zh) * | 2015-02-13 | 2015-05-06 | 北京奇虎科技有限公司 | 程序的监控方法及其防御方法以及相关装置 |
CN106227671A (zh) * | 2016-08-05 | 2016-12-14 | 网易(杭州)网络有限公司 | 程序运行性能分析方法及装置 |
CN106802785A (zh) * | 2016-12-13 | 2017-06-06 | 北京华为数字技术有限公司 | 一种栈解析方法和装置 |
CN107291480A (zh) * | 2017-08-15 | 2017-10-24 | 中国农业银行股份有限公司 | 一种函数调用方法及装置 |
CN110245027A (zh) * | 2018-09-21 | 2019-09-17 | 浙江大华技术股份有限公司 | 一种进程间通信的方法和设备 |
CN112306473A (zh) * | 2020-10-27 | 2021-02-02 | 深圳市元征科技股份有限公司 | 一种程序接口传参方法、系统及相关设备 |
Non-Patent Citations (3)
Title |
---|
Live Range Splitting at Recursive Function Calls;Stefan Schaeckeler;《2007 Innovations in Information Technologies (IIT)》;1-5 * |
基于指针概念理解JAVA知识点;王建红;《电脑迷》;187 * |
基于边界逆向的浏览器安全缺陷检测技术的研究和实现;任懿;《中国优秀硕士学位论文全文数据库 (信息科技辑)》;I139-159 * |
Also Published As
Publication number | Publication date |
---|---|
CN112882695A (zh) | 2021-06-01 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN112882695B (zh) | 传参方法、装置、计算机设备及存储介质 | |
CN109697060B (zh) | 视频特效系统及其生成方法、装置、设备和存储介质 | |
US6446258B1 (en) | Interactive instruction scheduling and block ordering | |
KR101244104B1 (ko) | 컴퓨터 시스템 및 레지스터 윈도우 아키텍쳐를 지원하도록 컴퓨터 시스템을 구현하는 방법 | |
US20060200815A1 (en) | Electronic Device and Method for Updating Related Programs | |
US20070133399A1 (en) | Data processing in which concurrently executed processes communicate via a fifo buffer | |
US20130036426A1 (en) | Information processing device and task switching method | |
CN113110860B (zh) | 一种嵌入式终端远程软件更新方法 | |
CN114663272B (zh) | 一种图像处理方法及电子设备 | |
JP2005346168A (ja) | キャッシュメモリ、システムおよびデータ格納方法 | |
US5878261A (en) | Method for restructuring code to reduce procedure call overhead | |
CN109189607A (zh) | 一种应用程序断点恢复的方法 | |
CN112596918A (zh) | 系统内各程序间共享变量的方法及存储装置 | |
JPH10214203A (ja) | 情報処理装置 | |
CN114816532B (zh) | 一种提高risc-v二进制代码密度的寄存器分配方法 | |
CN112882701A (zh) | 一种支持多架构的可执行文件静态插桩技术框架 | |
CN112882753A (zh) | 程序运行方法及装置 | |
US11681527B2 (en) | Electronic device and multiplexing method of spatial | |
CN104657175A (zh) | 利用配置芯片实现启动引导和数据的读写系统及方法 | |
CN112036552B (zh) | 一种卷积神经网络运转方法和装置 | |
CN117234953A (zh) | 一种基于影子代码缓存的内核调试方法 | |
CN111221535B (zh) | 线程分配方法、服务器及计算机可读存储介质 | |
US20230280987A1 (en) | System and method for controlling execution of call stack frames | |
CN112947897A (zh) | 跨平台的api共享方法、装置、系统及存储介质 | |
CN116167906A (zh) | 一种图像处理方法及电子设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |