美文网首页
swift初探之输入输出函数 inout

swift初探之输入输出函数 inout

作者: 皇军让我给你捎个话 | 来源:发表于2020-10-30 16:01 被阅读0次

定义:可以在函数内部修改外部实参的值

首先我们写一个输入输出函数

定义输入输出函数

上面是定义一个交换的函数,swapValues的两个函数使用了inout关键字,传入参数时需要在参数前面加上&。

调用swapValues函数使得外部num1、num2的值进行修改。这里就会有个疑问,为什么外部额变量会被修改,是通过什么样的方式进行修改。这里我会想到c语言里面把地址传递进去,函数对地址里面的内容进行修改。但是我在网上查阅了一些资料感觉不靠谱。后来看了一些视频,找了一些资料。找到了最好的方法就是查看汇编代码进行验证。

    我是一点汇编的基础都没有,都是现学现卖。有不对的地方多多指教。

首先把多余的代码去掉,不然汇编里面会有一些不必要的代码进行混淆。对于像我这样的小白,看起来特别的繁琐。其次在调用函数的地方打个断点。运行起来进入到汇编的页面。

进入到汇编页面,看起来一头雾水。但是第一眼就能看到$0xa和$0x14,这不就是16进制的10和20么。

我们可以通过0x9844(%rip)算出10存储在内存中的位置为0x10000C310,我们可以查看内存中的存储

10和20都存储在内存中,接下来断点走到下一个断点。

重点来了,leaq命令是把0x97f9(%rip)地址传给rdi、0x97fa(%rip)地址传给rsi。leaq当中的q是单位,是8个字节。

0x97f9(%rip)和0x97fa(%rip)这两个算出来的地址就是存储10和20的地址。读者可以自行验证。

callq是调用函数,在控制台输入si进入callq所对应的函数。

上图就是swapValues函数的汇编。首先是初始化一段内存,rdi、rsi是外面出入进来的参数。就是num1和num2的地址。取出rdi内存存储的地址所对应的值给到rax,取出rsi内存存储的地址所对应的值给到rcx,之后把rcx的值赋给rdi内存存储的地址所对应的内存,在把rax的值赋给rsi内存存储的地址所对应的内存。这里就是我们函数里面的交换。

所以这里就看出看inout关键字本质是通过地址传递进行值修改的。但是注意的是传谁的地址还是有区别的。

相关文章

  • swift初探之输入输出函数 inout

    定义:可以在函数内部修改外部实参的值 首先我们写一个输入输出函数 上面是定义一个交换的函数,swapValues的...

  • Swift inout参数本质

    输入输出参数 (In-Out Parameter) • 可以用inout定义一个输入输出参数:可以再函数内部修改外...

  • 无标题文章

    swift 语法 1.inout() 希望传入参数通过函数改变 func swapTwoInts( a:Int, ...

  • Swift汇编分析inout关键字

    因为inout关键字比较简单,因此该文章篇幅相对比较短小。我们直到在swift中inout通常用来在函数内修改外部...

  • 2017-12-26

    swift泛型的使用 ''' func exchange( a: inout T, b : inout T){//...

  • swift之inout

    swift中需要对参数只进行修改,需要用到inout 关键字,调用函数时加& 喜欢可以加Q群号:874826112...

  • swift 学习(二)

    参数标签可以省略,但是苹果官方不推荐这样使用 输入输出参数(在函数里面修改外部变量):关键词 inout 入参...

  • 4.4 函数的输入输出inout参数解析 [Swift教程]

    1. 本节课将为你演示输入输出参数的使用。如果需要一个函数可以修改参数的值,并且想让修改可以保持在函数调用之后,那...

  • Note 5 闭包和代码做UI

    函数 函数传进去的值想在函数里面改变,加个inout例:a: inout In 函数 封装一段代码函数重载 :两个...

  • inout 参数

    在函数的参数中,可以传inout类型参数,如下: 其中inout关键字,当引用相应有inout参数的函数时,参数前...

网友评论

      本文标题:swift初探之输入输出函数 inout

      本文链接:https://www.haomeiwen.com/subject/saldvktx.html