- 博客(36)
- 收藏
- 关注
原创 Rust:复合类型(元组、数组)
在Rust的类型系统中,元组和数组是最基础的复合类型,但它们的设计蕴含着深刻的系统编程哲学。与高级语言中的动态数组或对象不同,Rust的复合类型直接映射到内存布局,提供了可预测的性能和零运行时开销。然而,这种底层控制力也带来了独特的挑战——如何在编译期保证类型安全?如何处理不同大小的数据?如何在泛型编程中利用这些类型?本文将从内存布局到高级应用,全面剖析Rust复合类型的设计智慧。💡。
2025-10-29 20:35:33
595
原创 Rust:与JSON、TOML等格式的集成
对于复杂的业务需求,默认的序列化行为可能不够。例如,时间戳可能以字符串或Unix时间戳的形式出现,需要统一转换为DateTime类型。where;;这个实现展示了几个关键技巧:首先反序列化为通用的Value类型,然后根据实际类型进行转换。这种两阶段处理避免了直接面对底层格式的复杂性。错误处理使用统一包装,保证了与Serde错误报告机制的兼容性。
2025-10-29 20:32:25
976
原创 Rust:WebSocket支持的实现
WebSocket协议革新了Web实时通信的方式。相比传统的HTTP轮询,WebSocket提供了全双工、低延迟的双向通道。然而,在Rust中实现一个生产级别的WebSocket服务器绝非简单的包装问题。它涉及协议细节的精准把握、异步编程的复杂性、以及并发安全的严格保证。本文将从WebSocket协议的原理出发,深入探讨其在Rust异步生态中的实现挑战与最佳实践。
2025-10-29 20:29:57
845
1
原创 Rust:Tokio的性能监控与调优
许多人倾向于自己构建监控系统。观测本身会对性能产生影响。在高频路径上进行原子操作或锁操作来记录指标,会显著增加开销。例如,使用计数所有任务生成事件,在百万并发任务的场景下,这个"简单"的计数操作就能消耗20%的CPU。最佳实践是采用采样策略。不是记录所有事件,而是按概率采样(如1000个事件中采样1个),或者在关键路径使用无锁数据结构(如)异步收集数据,然后在低优先级任务中批量处理。Tokio的提供了管理任务集合的高效方法,而我们可以为此添加采样的性能观测。// 执行业务逻辑});
2025-10-29 20:27:43
738
原创 Rust:异步锁(Mutex、RwLock)的设计
为了深入理解异步锁的实现,我构建了一个针对读多写少场景优化的RwLockSelf {loop {// 如果有写者(MSB为1),等待写者完成= 0 {continue;// 尝试增加读者计数count,count + 1,// 获取写锁信号量,确保只有一个写者// 设置写者标志位(MSB)loop {count,break;// 等待所有读者退出_permit,// 清除写者标志位// 唤醒所有等待的读者。
2025-10-29 20:25:30
901
原创 仓颉技术:Set集合的去重机制
Set的去重机制,是Hash和Eq共同构建的精妙舞蹈。仓颉作为一门追求“安全”的系统语言,它深知这种“手动实现”的危险性。因此,它一定会提供强大的**“自动派生” (Derive) 机制**。永远不要手动去实现Hash和Eq,除非你万不得已(比如我们的“只比较 ID”的特殊需求)。尽可能地使用这样的注解。编译器会自动为你生成始终遵守“黄金契约”的代码(它会同时哈希所有字段,并同时比较所有字段)。Set的去重机制,不仅是算法问题,更是“语言契约”问题。
2025-10-29 20:03:20
620
原创 仓颉技术:UTF-8编码处理
它用String类型封装了 UTF-8 的复杂性。它用 `Result 在边界处挡住了非法数据。它用“禁止索引”和“安全切片”倒逼开发者去思考“字节”和“字符”的本质区别。在仓颉中处理文本,我们不再是“C 程序员”,我们是“Unicode 时代的系统工程师”。我们必须(也乐于)为这种健壮性而支付“思维的成本”。加油!让我们一起掌握这个最基础、也最强大的工具!🥳。
2025-10-29 20:01:01
1818
原创 仓颉技术:FFI外部函数接口
unsafe不是用来“偷懒”的,它是用来“隔离”的。仓颉 FFI 的目标,不是让仓颉代码去“迁就” C,而是要构建一个坚固的“抽象层”(防火墙),将 C 的“不安全”和“粗糙”的接口,**“翻译”成仓颉的“安全”与雅”的 API**(如自动内存管理和Result错误处理)。// 业务代码(100% 安全,符合仓颉惯用法)仓颉通过 FFI 拥抱了庞大的 C/C++ 生态,但它没有在“安全”上做任何妥协。这才是系统级编程语言的真正担当!加油!🚀。
2025-10-29 19:55:15
638
原创 仓颉技术:尾递归优化
仓颉的尾递归优化(TCO)不是一个孤立的特性,它是仓颉“高性能”与“高可靠”设计哲学的重要支柱。它允许开发者在系统编程的“深水区”(如网络、OS、解析器)中,放心地使用“函数式”的清晰、不可变、无副作用的编程范式,而无需担心传统递归带来的内存和性能惩罚。这是一种解放——将开发者从“如何优化”的焦虑中解放出来,转而专注于“如何正确表达”业务逻辑。这,才是系统级语言的真正魅力!🎉。
2025-10-29 19:53:09
995
原创 仓颉技术:Union类型的定义与应用
仓颉的 Union 类型,是其作为一门现代化系统语言的“类型安全”基石。它鼓励开发者从“可能性的集合”出发去思考问题,用编译器来保证逻辑的严谨性。它不仅仅是一种数据结构,更是一种强大的架构设计模式,能帮助我们构建出状态清晰、行为可预测、几乎不可能出现非法状态的高可靠性软件。这,才是系统级开发的真正精髓。加油!让我们拥抱类型,驾驭复杂!🎉。
2025-10-29 19:47:33
834
原创 【C语言系列】数据在内存中存储
x86 —— 小端模式(DSP) KEIL C51 —— 大端模式其实超过一个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储。大端字节序存储:把一个数据的低位字节的内容存储到高地址处,把高位字节的内容存储到低地址处。小端字节序存储:把一个数据的低位字节的内容存储到低地址处,把高位字节的内容存储到高地址处。如下图:为什么有大小端模式之分?
2025-03-23 19:00:49
4422
58
原创 【C语言系列】C语言内存函数
本文详细探讨了C语言中几个核心内存操作函数的使用方法和原理,包括memcpymemmovememset和memcmp。这些函数是处理内存数据的基本工具,广泛应用于高效的内存管理、数据复制、初始化和比较等场景。memcpymemcpymemmovememset和memcmp是C语言中处理内存数据的基础函数,掌握它们的使用方法对于进行高效的内存操作至关重要。memcpy和memmove都用于内存复制,但memmove能够安全地处理内存重叠情况。memset用于设置内存内容,而memcmp用于比较内存区域。
2025-03-16 12:48:26
1912
78
原创 【C语言系列】字符函数和字符串函数
这篇文章详细介绍了 C 语言中关于字符处理和字符串操作的一些常用函数。文章主要分为字符分类函数、字符转换函数、字符串操作函数以及它们的模拟实现,帮助读者深入理解并掌握这些函数的使用方法。首先,文章介绍了 C 语言中常用的字符分类函数,如islowerisdigitisspace等,这些函数通常用于判断字符是否属于某一类(如数字、小写字母、空白字符等)。这些函数都包含在<ctype.h>头文件中,使用方法简洁且直观。例如,islower用来判断一个字符是否为小写字母,isdigit判断字符是否为数字,
2025-03-09 18:37:50
3796
74
原创 DeepSeek与ChatGPT:AI语言模型的全面对决
官方网页版:这是最便捷的使用方式,适合大多数用户。用户只需打开浏览器,访问 DeepSeek 官方网站(https://chat.deepseek.com/ ),即可开启智能之旅。首次使用的用户,可通过手机号、微信或者邮箱进行登录。登录成功后,点击 “开始对话”,就能与 DeepSeek 展开互动。在提问时,用户可以根据需求选择 DeepSeek V3 或 DeepSeek R1 模型。V3 模型通用性强,能处理多种常规任务;R1 模型则在逻辑推理任务上表现出色,如代码编写、数学计算等。
2025-02-16 20:09:22
13400
86
原创 【C语言系列】深入理解指针(5)
本文深入探讨了C语言中关于sizeofstrlen、数组和指针的一些基础概念,并通过代码示例进行了详细的讲解。本篇文章深入分析了sizeofstrlen、数组与指针等概念,并通过一系列代码示例加深了对这些概念的理解。对于初学者来说,掌握这些基础知识是学习C语言的关键。文章不仅揭示了这些基本概念的使用方法,还通过具体例子帮助理解如何避免常见的错误,如越界访问和指针运算中的误解。
2025-02-06 16:19:51
12010
48
原创 【C语言系列】深入理解指针(4)
这篇文章详细介绍了C语言中的回调函数和qsort函数的使用,通过具体的代码示例展示了如何利用这些技术实现灵活的函数调用和数据排序。回调函数回调函数是一种通过函数指针调用的函数。在C语言中,函数指针允许我们将函数的地址作为参数传递给另一个函数,从而在特定的事件或条件下调用这些函数。文章通过一个简单的计算器程序展示了回调函数的使用。原始代码中,通过一个函数指针数组来选择不同的运算函数。改造后的代码中,使用了回调函数,将运算函数的地址作为参数传递给Calc函数,从而实现了更灵活的函数调用。
2025-01-26 22:35:08
1704
33
原创 【C语言系列】深入理解指针(3)
这篇文章详细介绍了C语言中指针相关的重要概念,包括字符指针、数组指针、函数指针及其数组的使用。通过代码示例,文章解释了如何利用指针进行内存管理以及如何实现更灵活、动态的功能调用。以下是对文章内容的总结。首先,文章介绍了字符指针(char*),它是指向字符的指针类型,常用于操作字符串。通过代码实例展示了如何通过字符指针访问字符串内容,特别是常量字符串的特点。常量字符串存储在只读内存中,因此不能修改。作者通过对比字符数组与字符指针的内存分配,强调了字符指针指向的是字符串的首字符地址,而非整个字符串。
2025-01-23 23:24:35
2359
22
原创 【C语言系列】深入理解指针(2)
运行结果如下图:通过运行代码我们可以知道**&arr[0] 拿到了数组第一个元素的地址和数组名拿到的地址是一样的。(即数组名就是数组首元素的地址)**运行结果如下图:观察上述代码,不难看出如果数组名是首元素的地址那么打印出来应该是4或者8。答案是肯定的,那么问题又来了,那arr和&arr有啥区别呢?运行结果如图:这里我们发现&arr[0]和&arr[0]+1相差4个字节,。但是&arr和&arr+1相差40个字节,这就是因为。
2025-01-21 16:09:00
2066
73
原创 【C语言系列】深入理解指针(1)
总所周知,C语言中指针部分是非常重要的,这一件我们会介绍指针相关的内容,当然后续我还会出大概4篇与指针相关的文章,来深入的讲解C语言指针部分,希望能够帮助到指针部分薄弱或者根本不会的程序员们,后续文章尽情期待!
2025-01-19 23:06:28
1423
32
原创 【C语言系列】操作符的详解
数组中存放多个元素,使用{}初始化;结构体中存放多个成员,使用{}初始化。intx;inty;intx;inty;intage;intdata;intmain()structStudents1={"张三","男",18,"2024090203"};//直接访问成员//结构体变量.结构体成员return0;
2025-01-18 13:02:19
1100
24
原创 【C语言系列】函数递归
n是超过1位数的话,就得拆分每⼀位1234%10就能得到4,然后1234/10得到123,这就相当于去掉了4,然后继续对123%10,就得到了3,再除10去掉3,以此类推不断的%10 和 /10 操作,直到得到1234的每一位。这里的代码会导致栈溢出,虽然是个错误的代码但是能够很明确的表达出递归的意思,在这里我们可以看出这个代码一直在执行打印操作,体现了函数递归的现象,但是由于死循环的打印导致了栈溢出的现象。自然数n的阶乘写作n!当 n==0 的时候,n的阶乘是1,其余n的阶乘都是可以通过公式计算。
2025-01-12 21:00:20
1137
7
原创 【C语言系列】VS实用调试技巧
BUG现在一般指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。介绍BUG的来源: “Bug” 的创始⼈格蕾丝·赫柏(Grace MurrayHopper),她是⼀位为美国海军工作的电脑专家,1947年9月9日,格蕾丝·赫柏对Harvard MarkII设置好17000个继电器进行编程后,技术人员正在进行整机运行时,它突然停止了工作。于是他们爬上去找原因,发现这台巨大的计算机内部⼀组继电器的触点之间有⼀只飞蛾,这显然是由于飞蛾受光和热的吸引,飞到了触点上,然后被高电压击死。
2025-01-12 12:41:30
1298
3
原创 【C语言系列】数组和函数实践:扫雷游戏
1.使用控制台实现经典的扫雷游戏。2.游戏可以通过菜单实现继续玩或者退出游戏。3.扫雷的棋盘是9 * 9的格子。4.默认随机布置10个雷,可以排查雷。5.如果位置不是雷,就显示周围有几个雷。6.如果位置是雷,就炸死游戏结束。7.把除10个雷之外的所有非雷都找出来,排雷成功,游戏结束。
2024-11-08 23:32:32
1153
3
原创 C语言系列之函数
了解了库函数,我们可以了解一下自定义函数,自定义函数的出现为程序员写的代码创造了更多的可能。下面来介绍自定义函数。通过上面我们了解到自定义函数的语法形式以及注意事项和作用,我们下面来举一些示例:例:写一个加法函数,完成2个整型变量的加法操作。return z;//这个代码块可改为return x+y;int b = 0;return 0;在VS上运行的话会出现scanf报错问题可以查看我前面的文章来解决,可永久解决这个问题。
2024-11-01 20:26:07
2061
1
原创 C语言系列之数组
定义:数组是一组相同类型元素的集合。①数组中存放的是1个或多个数据,但数组元素的个数不能为0。②数组中存放的多个数据,类型是相同的。数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。语法:例:2.2数组的初始化通常我们会在创建数组的同时给数组赋一些初始值,这种就称之为数组的初始化。例:初始化有以下一些类型:完全初始化,不完全初始化2.3数组的类型数组也是有类型的,数组算一种自定义类型,去掉数组名留下的就是数组的类型。例:三、一维数组的使用3.1数组下标C语⾔规定数
2024-10-29 22:50:25
1412
4
原创 C语言系列之数组
定义:数组是一组相同类型元素的集合。①数组中存放的是1个或多个数据,但数组元素的个数不能为0。②数组中存放的多个数据,类型是相同的。数组分为一维数组和多维数组,多维数组一般比较多见的是二维数组。语法:例:2.2数组的初始化通常我们会在创建数组的同时给数组赋一些初始值,这种就称之为数组的初始化。例:初始化有以下一些类型:完全初始化,不完全初始化2.3数组的类型数组也是有类型的,数组算一种自定义类型,去掉数组名留下的就是数组的类型。例:三、一维数组的使用3.1数组下标C语⾔规定数
2024-10-24 21:22:32
1123
2
原创 分支和循环(下)
例子:写一个猜数字游戏!游戏要求:1、电脑自动生成1~100的随机数。2、玩家猜数字,猜数字的过程中,根据猜测数据的大小给出大了或小了的反馈,直到猜对,游戏结束。
2024-10-03 15:14:10
779
3
原创 用C语言解决闰年的判断和关机程序的实现
题目:输⼊⼀个年份year,判断year是否是闰年分析:闰年判断的规则:1、能被4整除并且不能被100整除是闰年。2、能被400整除是闰年。
2024-09-26 23:07:54
244
1
原创 分支和循环(上)
本章内容较多,我会分为上下两个小节来给大家讲解,上半节我们讲解了if语句、三大操作符(关系操作符、条件语句、逻辑操作符)、switch语句、while循环、for循环、do-while循环、循环嵌套以及goto语句,这些内容会让我们了解不少分支和循环的知识,如有讲解不全望给建议!希望能对你们有帮助。
2024-09-26 22:59:09
946
5
原创 printf和scanf的介绍以及VS解决scanf报错问题
本章内容涵盖了print和scanf的基本介绍,还有scanf的返回值问题以及scanf的越界访问问题的解决方法,还有VS上scanf报错的原由及解决办法,这里还用保姆级教程介绍eyething的安装步骤。希望本次讲解能够解决大家VS上scanf报错的问题,加强大家对printf和scanf的理解。
2024-09-03 22:06:17
1918
1
原创 初识C语言(下)
本章内容为初始C语言下半部分,将一些C语言的常见概念进行阐述并不会深层次的探究,后续会深入讲解C语言的,适合初学者能够初步认识到C语言及其常见的概念。高校教育较为注重素质教育和现在的公司需求还是有一定的差距,这篇文章可以为初学C语言的初学者们提供参考,如果你对C语言的整体知识不太了解,可以读一读笔者的文章,带你零基础学透C语言。C语言中把数据结构分为内置类型和自定义类型。内置类型:本身自带,可以直接使用。** 自定义类型**:程序员自己创建,可自己创造想要的类型。①字符型char②整型。
2024-08-29 22:27:01
2188
3
原创 初识C语言(上)
VS中:xxx.h表示的是头文件,xxx.c表示的是源文件,xxx.c指的是C语言的源文件以.c为后缀,而xxx.cpp指的是c++的源文件以.cpp为后缀。要运行代码需要三步:1.编译 2.链接 3.运行。注:在VS中,编译和链接一般是同时进行的。总体来看,本篇文章是初步对C语言概念进行总结概括,有些内容并没有深入去探讨,在C语言这系列的文章我会后续更新,我希望这篇文章会给初学C语言的读者们一些帮助,有疑问的可以后台问我,我会一 一解答。
2024-08-18 18:11:38
781
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅