C++类机制
从现在开始从程序员的角度学习C++类的基础语法规则
类基础1.组成类是由数据成员加函数组成的一种新的数据类型
2.类成员的访问通过this指针,可以使成员函数可以访问成员变量,this指针作为成员函数的第一个隐式参数,当实例化类调用函数时,会将变量的地址传入this。
this的默认类型是指向非常量类型的常量指针,也就是说this本身不能变化,但是只能指向非常量类型,也就是const修饰的类类型无法使用,为了改善这一点,需要在函数参数后加上const关键字进行修饰。将this声明为指向常量类型的常量指针。
如:std :: string isbn() const { return bookNo; }
const修饰一个类也可以有更加细腻的访问控制,mutable关键字修饰的类成员可以改变
3.类成员的访问之作用域
访问数据需要保证数据的可达性,也就是作用域,需要考虑数据的声明以及定义
类内的访问规则为:成员函数体可以随意访问成员变量,不需要考虑定义的位置。成员函数也可以定义在类的外部,但是需要和类声明相匹配。需要加类修饰符,类似于命名空间。
4.类初始化类使用一个 ...
linux5.15之page分配
本文按照Linux内核深度解析为主线,做的一些总结和梳理
1.关于内存分分配标志
参考gfp.h
1.1一些掩码/* Plain integer GFP bitmasks. Do not use this directly. */#define ___GFP_DMA 0x01u#define ___GFP_HIGHMEM 0x02u#define ___GFP_DMA32 0x04u#define ___GFP_MOVABLE 0x08u#define ___GFP_RECLAIMABLE 0x10u#define ___GFP_HIGH 0x20u#define ___GFP_IO 0x40u#define ___GFP_FS 0x80u#define ___GFP_ZERO 0x100u#define ___GFP_ATOMIC 0x200u#define ___GFP_DIRECT_RECLAIM 0x400u#define ___GFP_KSWAPD_RECLAIM 0x800u#define ___GFP_WRITE 0x1000u#define ___ ...
密码学实战
维吉尼亚密码
以一道作业题为例子
思路
1.确定m,利用重合指数法,首先猜测m的长度,然后按m将密文分组,取每组的第1,2….n,分别放在一起,形成新的文本,以字典形式表示,key = 组号 ,value = 字符串。
2.计算重合指数,因为key是变化的,每一组需要多右移动一次,因此每一个字符串并非是简单的平移,而是后一个字符要多平移一个,因此需要变换字符串为正常情况来进行重合指数的分析,(就是把每个字符串的字符按索引平移回去)。
3.重合指数的计算,遍历m,分别计算平均重合指数,然后取平均值在0.6以上的(则表明非随机)。
4.确定key,再次利用重合指数法,算出每一个组的每个字符出现的频率,然后利用有意义字符的频率,来进行重合指数的计算(最多尝试26次,即可确定key),注意解出来的并非是key,而是key的逆,也就是说key-26。
5.通过4计算而得的key,平移每个组的字符串,再将其按照一的方式组合回去,即可得到明文。
实现1.文本预处理
这一步删除掉密文的换行之类,并统一大小写
def pretreatment(): with open ...
linux5.15之page
主要讨论了page的管理方式,搭配不同的内存模型,应该是比较底层的部分,此部分学习主要是参考了前人的文章,主要还是先理解如何管理吧,初始化等部分和架构结合的比较紧密,需要看汇编了,一步一步来。
文章https://mp.weixin.qq.com/s/CZW7kjeyDrDOmF8hjnyw0Q
https://arttnba3.cn/2021/11/28/OS-0X02-LINUX-KERNEL-MEMORY-5.11-PART-I/#Sparse-Memory
linux5.15之内存管理初始化(x86)
主初始化函数在main.c中,主要研究以下几个部分:
1.node的初始化
2.zone的空间分配
3.node的zonelist的初始化
blog
https://7r1pl3j.github.io/2022/11/17/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/#Linux-%E4%B8%89%E7%A7%8D%E5%86%85%E5%AD%98%E6%A8%A1%E5%9E%8B
终于是理解了node,zone,pfn以及page。
setup_arch(&command_line)
涉及到cpu与node之间关系的建立以及,node与内存之间映射关系的建立
在建立关系之前需要有一个分配器来完成内存的分配,因此需要bootstrap,需要先初始化一个笨重的分配器,来进行最初的内存分配,直到高级的分配器完全建立。
涉及部分数据结构如下:
//分别是获得io,和分配节点的部分代码u16 *cpu_to_apicid = early_per_cpu_ptr(x86_cpu_to_apicid);cpu_to_node_map[cpu] = n ...
rust初探
前言trait特性是rust中比较重要的,类似于c++中的虚函数特性,但是从对象为主导,变成了以函数为主导,第一感觉rust像是面向函数式编程。
使用
可以先定义trait定义一组方法,然后绑定给不同的数据结构,然后可以根据数据结构的不同访问不同的方法,也有c++中类似于动态绑定的概念,但是要比继承简单很多。
示例:
trait Shape { fn area(&self) -> f64;}struct Circle { radius: f64,}struct Square { side: f64,}impl Shape for Circle { fn area(&self) -> f64 { 3.14 * self.radius * self.radius }}impl Shape for Square { fn area(&self) -> f64 { se ...
rust初探
从现在开始进行rust语言的学习。
1.基础概念
此部分比较简单,基本上是每个语言都有的概念
c语言的差异:1.静态类型 2.没有隐式类型转换。
数据类型
主要分为标量以及复合类型,具体可参考https://kaisery.github.io/trpl-zh-cn/ch03-02-data-types.html
标量:整型、浮点型、布尔类型和字符类型。
复合类型:Rust 有两个原生的复合类型:元组(tuple)和数组(array)。
变量
要搞清楚可变变量和不可变变量(默认),以及常量(c语言是运行时检查的,加上const关键字)
也要搞清楚什么是变量遮掩。(Shadowing)可以和作用域以及别名来联想对比学习。
函数
和一般的函数没什么不同,无非就是返回值,名称以及参数,函数的最后一个表达式的值默认为返回值(下面会讲解表达式)
语句以及表达式
语句(Statements)是执行一些操作但不返回值的指令。 表达式(Expressions)计算并产生一个值.
{}是比较常见的表达式。
控制流
无非就是改变程序的原本的执行流程的一些功能,是一种特殊的表达式。
关于if:在 ...
rust初探
https://rustmagazine.github.io/rust_magazine_2021/chapter_1/toc.html
https://zjp-cn.github.io/tlborm/proc-macros/methodical/derive.html