c语言杂谈系列
文章平均质量分 59
c
skaiuijing
这个作者很懒,什么都没留下…
展开
-
c程序杂谈系列(封装)
以该文件为例,笔者将私有类放在源文件,然后在定义初始化的相关函数,比如initd(),这个函数隐藏了virtual_new函数,但是可以在头文件中声明,从而被调用,这就实现了接口。在头文件中使用typedef进行重定义,可以达到模拟private的效果,但是除了不能直接访问该数据结构,并不影响定义指针然后分配内存。至此,封装的要素class,public,private已经大致实现,下一节笔者讲一讲继承。但是开源后随着不断更新和修改,在现在的新版本中,笔者甚至觉得有点臃肿了,不是十分好用。原创 2024-07-24 15:04:51 · 429 阅读 · 0 评论 -
函数式编程思想
我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想.如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c…原创 2024-09-08 21:48:27 · 754 阅读 · 0 评论 -
流编程思想
程序可以看作流,任何程序执行的过程都可以看成是流动的过程。基于这个思想,我们可以将程序划分为数据流与控制流。数据流是数据实现的过程,对于相同的任务需求,最终数据流都会流向相同的地方,笔者进行举例,以数组操作为例:为了更方便抽象出流的概念,笔者决定将其转化为汇编,这样操作尺度更小,更容易观察程序流。数组每个成员加一既是结果,也是过程的必然,但是考虑一下两种情况:f2就是常量1,x1就是数组地址起始处。原创 2024-08-10 15:34:57 · 428 阅读 · 0 评论 -
c程序杂谈系列(加减乘除模篇)
为了提高c语言的运行效率,我们需要采用更高效的运算,那么切入点就是随处可见的基本运算符合,从底层架构考虑,加减乘除的效率比位运算低很多,为了能够更好迎合CPU的二进制,有必要取代基本的加减乘除以及求余符号了。求余符合是非常耗费时间的,但是我们的CPU采用的是二进制,有没有利用二进制的性质来提高效率的呢?如果只是摆出结论,可能会让很多人感到无所适从,让我们看看有哪些有名的框架源码用到了这一结论吧。当然有,笔者先给出结论:对于正整数X,Y = 2^n,X%Y 可以被X&(Y-1)代替。原创 2024-07-28 09:28:31 · 233 阅读 · 0 评论 -
巧用二级指针
当然,指针也并不是越多级就越好,我们也看到了,指针的本质仍然是变量,只是对存储的值有一定要求而已。当我们进行 int *a = malloc(sizeof(xxx))的操作时,实际上就是改变这片空间存储的值。int *a,代表在内存中开辟一片空间,空间存放a的值,只不过此时a的值是一个地址,可以通过这个值找到另一块内存空间。所以说,(int)(&(&(&a)))中,只有&a是成立的,&(&a)完全是错误且荒谬的。传址调用对于多级指针也是成立的,毕竟笔者前面已经说过,指针的本质是变量。原创 2024-09-16 17:21:39 · 1010 阅读 · 1 评论 -
C程序优化与指针传址
首先,int token,代表token的大小是已知的,就是一个int,但是int *token,token只是代表一个指向int的一个指针,是需要我们初始化的,不然直接*token的后果就是野指针,你也不知道它到底指向了哪里。刚开始,笔者并没有初始化token指针,直到编译程序并执行后,程序出现segmentation fault,使用gdb调试时,意识到没有初始化内存,于是使用malloc函数分配,执行完程序后再使用free释放。开始程序使用全局变量,程序如下:程序的缺点是全局变量的泛滥。原创 2024-07-22 13:39:01 · 194 阅读 · 0 评论 -
c程序杂谈系列(面向对象:封装)
笔者决定用c语言模仿高级语言,例如模拟面向对象:封装,继承,多态。当然,源码只使用c语言和汇编。如果你偶然找到了这篇博客,但是发现不知所云,请不要过多投入时间,可能笔者本人那时候也看不懂了。先说面向对象的封装:在Java中,有public,private对成员进行封装,在c语言中我们又该怎么办呢?本系列博客主要介绍c语言的一些屠龙技,里面包含了笔者本人的一些奇思妙想。如果使用pri->id直接访问,会出现报错,必须使用对应的接口进行访问。让笔者先介绍第一种示例:结构体定义放在源文件,接口和声明放在头文件。原创 2024-07-23 18:04:46 · 186 阅读 · 0 评论 -
指针与函数传递
title: 指针与函数传递description: 函数传递多个元素skaiuijing。原创 2024-09-15 13:03:31 · 991 阅读 · 0 评论 -
c程序杂谈系列(继承)
调用时,使用&obvir,可以想象我们定义数组*p,p表示该数组第一个成员,这是因为结构体声明时的顺序和内存中的顺序是一样的,&obvir也是同理,不过我们获得的实际上是vir结构体的地址,也就是一个指向vir结构体的指针,但是要进行强制类型转换,否则会出错。上一节笔者用宏和文件模拟了封装,这一节笔者继续使用c语言模拟继承。简单介绍就是:在结构体里面重新定义需要继承的结构体。原创 2024-07-27 14:25:36 · 223 阅读 · 0 评论 -
c语言杂谈系列:模拟虚函数
笔者推测,gcc应该是无法找到对于结构体,就把vtable当成了数组,加上*就成为了数组。然后&vtable就成为了二级指针,由于draw1本身就是一个指针,把它转成空指针什么的可以随便赋值。gcc在找不到对应结构体后,索性为base里的vtable开辟了一段空间,由于&vatble是二级指针,但是找不到对应地址指向,可能它在编译过程中被转为了一级空指针,且等于draw1本身,这样就能解释通了。从整体来看,笔者的做法与之前的模拟多态十分相似,毕竟c++多态的实现与虚函数密切相关。原创 2024-08-19 11:06:17 · 359 阅读 · 0 评论 -
c语言杂谈系列:多态
在c语言中,模拟多态并不是一件简单的事,笔者简单说一下如何使用c语言模拟多态,该版本为粗糙版本。通过这种方法,就可以实现多态。title: c模拟多态。原创 2024-08-18 19:47:04 · 159 阅读 · 0 评论 -
static与inline
static一般是用来修饰变量或函数限定作用域实现封装功能,inline一般是为了效率考虑,建议编译器选择展开函数,而不是直接ldr调用,那么static inline是什么用法呢?先放结论:static是为了防止重定义错误,因为该函数定义在头文件,编译时会被替换到引入的源文件中,不使用static关键字,那么会出现多个函数重定义问题。原创 2024-09-11 22:37:37 · 419 阅读 · 0 评论 -
c程序杂谈系列(职责链模式与if_else)
从处理器的角度来说,条件分支会导致指令流水线的中断,所以控制语句需要严格保存状态,因为处理器是很难直接进行逻辑判断的,有可能它会执行一段时间,发现出错后再返回,也有可能通过延时等手段完成控制流的正确性。所以笔者在想,使用过多的if _else,除了可读性差,是否还会对执行效率造成影响呢?原创 2024-07-29 18:27:04 · 822 阅读 · 0 评论 -
self与方法
数据结构是程序中非常重要的一部分,它往往存储重要的数据,并且作用于各个文件,但是对数据结构的初始化、赋值等操作,在函数出现多重嵌套时,代码容易出现可读性变差等问题,这个时候,穿梭在各个函数及文件中的self指针,无时无刻不在提醒着我们数据结构的存在及重要性。通过定义self指针,我们可以非常方便的设置数据结构的各个成员,完成初始化等操作,我们不必在main函数中直接对数据结构的成员进行赋值,而是把这一切都放在函数中进行,当函数的嵌套非常深时,程序的可读性变得乱七八糟时,self的重要性就能体现出来了。原创 2024-09-14 21:33:00 · 260 阅读 · 0 评论