- 博客(8)
- 收藏
- 关注
原创 一分钱的浮点数问题
使用计算机记账要考虑浮点数精度的问题。计算机无法表示一个数轴上的无穷无尽的所有数,使用有限个二进制位和相应的浮点数表示方案,只能表示一条数轴上有限个的浮点数。并且在十进制下可以用有限位表示的一个小数,在这样的方案下可能会出现精度问题。 考虑这样的一段代码: int frac = (463.01 - 463)*100; 或许我们会期望frac的值是1,但实际上frac是0。因为计算机在并不能精确地表示463.01 - 463的结果,如果把463.01 - 463计算结果的后15位都打印出来,就可以看到并非是
2021-06-11 22:39:40 469
原创 结构体与类,值类型与引用类型
结构体与类的重要区别 Swift中,结构体与类的一个重要区别就是结构体是一个值类型而类是一个引用类型。如果定义一个全局变量的结构体,其数据将存储在数据段;而如果定义一个全局变量的类对象,数据段将存放其在堆空间的指针,其实际的数据将存储在堆空间(和类型信息与引用计数一起)。 值类型与引用类型 值类型与引用类型之间的一个重要差异在于,如果将一个值类型赋值给一个变量/常量,是直接将所有内容拷贝一份;而引用类型赋值给变量/常量,实际上是将内存地址拷贝一份,属于浅拷贝 (shallow copy)。 实际上在Swif
2020-12-10 23:50:44 1316
原创 if-else, switch, for/while循环流程控制的底层实现
if-else 的实现 任意编写一段 if-else 用作测试,如下: var i = 20 if i > 10 { i = 1 } else { i = 2 } 通过汇编代码来看计算机为了做出 if-else 的选择进行了哪些工作。编译后的汇编代码如下: TestSwift`main: 0x1000033a0 <+0>: pushq %rbp 0x1000033a1 <+1>: movq %rsp, %rbp 0x10
2020-12-05 20:17:35 546
原创 Swift枚举类在内存中的存储
首先给出结论:Swift的枚举量可以有关联值或原始值。在有关联值的情况下,Swift会根据所需内存空间最大的case为枚举变量分配内存,同时再多给出一个字节作为标志用于区分,但在出现关联值为Bool值的情况下会可能会将bool与用于区分的标志存储在同一个字节当中以节约空间,因为Bool实际上只需要1位存储;在有原始值的情况下,原始值并不存放在枚举变量当中,其所占空间大小与枚举变量所占空间大小无关。 swift的枚举类可以绑定其他类型的值存储: enum TestEnum { case test0
2020-12-03 23:07:55 562
原创 进程间的文件共享
UNIX操作系统中,不同的进程之间可以共享打开文件。用一张图片可以说明内核用于I/O的数据结构: 图中展示了三种表:进程表项中的文件描述符表,文件表项和v节点结构。 1. 文件描述符表:每个进程在进程表中都有一个记录项,记录项中包含一张打开的文件描述符表。将其看作一个矢量,每个描述符占用一项。其含有一个指向文件表项的指针。 2. 文件表项:对每一个打开的文件,都有一张文件表,其含有文件状态标志(只读只写等等,与文件描述符标志不同,文件描述符标志仅作用于进程的一个描述符,而文件状态标志应用于指向该.
2020-11-17 10:39:14 673
原创 ISO C, POSIX, XSI三大标准提供的限制值及设备间的可移植性
为了提高不同设备之间程序的可移植性,ISO C,POSIX,XSI三个标准对一些值作出了限制,如int最大值的下限(在ISO C中,即实现的int的最大值必须大于这个值),每个进程能够打开的文件数的下限(在POSIX中),路径名中字节数(在XSI中)。这些编译时限制的常量都列在头文件<limits.h>当中;而还有一些限制值需要在运行时确定,使用函数 sysconf, pathconf, fpathconf 确定。使用这些限制的常量而非系统实际支持的量或幻数可以提高程序的可移植性。举例来说,守护
2020-11-10 12:22:29 379
原创 系统调用与库函数的联系与差异
虽然从用户的角度来看,系统调用与库函数的行为没有什么不同;但从实现者的角度来看,系统调用与库函数是完全不同的两回事。这里介绍一点两者之间的差异。 系统调用,可以理解为直接进入内核的入口点。UNIX为每一个系统调用都在标准C库中设置了一个具有相同名字的函数,这些函数用系统要求的技术调用相应的内核服务。从应用的角度来看,系统调用与C函数的行为看起来完全一致。 而通用库函数并非内核的入口点,它们可能会调用大于等于0个的系统调用。比如printf会调用write系统调用来输出字符串;而strcpy与atoi不使
2020-11-08 11:10:41 483
原创 Unix环境高级编程-“apue.h“的导入与使用
对于 #include"XX.h",编译器会先在当前路径下搜索,因此可以把这个文件放在你要用到这个头文件的所有源码所在的目录下。 或者,放在编译器的内定目录下,以供所有位置访问: 首先找到编译器的文件搜索(include)路径, echo | gcc -v -x c++ -E - 这一指令对clang同样有效。 在这两行后可以看到头文件搜索的路径 #include "..." search starts here: #include <...> search starts her
2020-11-05 22:05:13 232
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人