C++_内联函数
定义 inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧 的开销,内联函数提升程序运行的效率。 适用于定义频繁使用的短小函数 C++中如何实现处理的: 用宏定义函数 12int Add(int a, int b) returen x+y; 宏定义为: 1#define ADD(x,b) ((x) + (y)) 宏定义的本质就是替换 宏的语法机制不好,容易出错,不支持调试,没有类型安全检查 于是C++有了内联函数 内联函数的本质也是替换 debug可以打断点调试 (因为内联函数在debug时不会进行替换,所以可以进行调试) 不容易出错,写法和普通函数一样 特性: inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替 换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。 inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建议:将函数规 模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归 ...
动态开辟二维数组
int a a是int类型的变量,内存中被命名为a的空间内保存的是一个整形数据 int* b b是int类指针类型的变量,内存中被命名为b的空间内保存的是一个整形指针(整形的地址)的数据 int** c c是int类型的指针的指针类型的变量,内存中被命名为c的空间内保存的是一个整形指针的指针(整形指针的地址)的数据 一维数组1234int a[4];//int是数组中元素的类型,a是数组的名称,也是数组的首元素的地址的引用,数组的元素在内存中是连续开辟的int* b[3];//数组b中的元素数据类型是int*,即整形指针 一维数组的动态开辟:12int* a = new int[10];//new了一个长度为10的int类型动态数组,并将数组的地址返回给a 别忘什么是动态内存: 栈中的内存开辟需要在编译前就要确定具体大小,比如在定义一个普通数组的时候,这个数组的大小一定是已知的,是一个常量,就算是用一个整形变量a用来在定义数组的时候表示数组的大小,在编译之前a的值也是一定要确定下来的 动态内存是在堆中开辟的,动态开辟内存就是在编译之前可以不指定需要开辟的空间的大小 ...
Java_内存分配
Java内存分配主要包括以下几个区域: 寄存器:我们在程序中无法控制 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 堆:存放用new产生的数据 静态域:存放在对象中用static定义的静态成员 常量池:存放常量 非RAM(随机存取存储器)存储:硬盘等永久存储空间 前瞻: new出的空间都是作为动态内存在堆中分配的,比如new出的对象的成员属性、使用new开辟的数组中的各个元素、使用new创建的基本数据类型等 局部变量在栈中分配,通常情况下,基本数据类型、对象名(对象的引用)存储在栈中 注意是通常情况下。 比如对象类型的数组,对象(的引用)是作为数组元素存储在堆中的,而不是栈: 1234567891011121314class Point(){ int x; int y; Point(int a ,int b){ this.x = a; this.y = b; }}public class main(){ public static void mai ...
Java_抽象类_接口
Java 抽象类抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类就是用来继承的,比如犬科,犬科里面含有很多种类的犬,但是各种犬之间的特征是不同的,因此先设计犬科这个抽象类,包含犬科的基本属性,再由具体的犬种比如哈士奇犬类继承犬科这个抽象类,构建了犬科属性下的一个具体的哈士奇犬类 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。 在 Java 中抽象类表示的是一种继承关系,一个类只能继承一个抽象类,而一个类却可以实现多个接口。 抽象类使用关键字abstract定义 1234567891011abstract class 抽象类名称{ /*成员属性、成员方法*/}class ...
Java_基本概念
源文件–编译单元Java项目中的编译单元是后缀为.java的源文件 main方法main方法是Java程序(就是项目)的入口,在Java项目(程序)执行的时候,从main方法开始执行。 一个源文件中最多有一个main方法;跟C++不同,一个Java程序允许多个main函数,每个源文件中都可以有一个main方法,但是在程序执行的时候,只能选择项目中的一个main方法作为项目的入口。 public类(公共类) 在此之前,先说一下访问权限 针对类、成员方法、成员属性,Java提供了四种访问控制权限修饰符关键字,在定义的时候加在最前面,附加上访问权限 分别是private defalut protected public private用于修饰成员对象和成员方法 当类、成员方法、成员属性没有权限修饰符的时候,默认是default,最多可以在本包下的其他源文件中被访问 protected用于修饰成员对象和成员方法 public修饰类、成员属性和成员方法的时候,允许在本项目中任何地方被访问(全局访问) 以下为当成员属性被不同的权限修饰符修饰时的可被访问的范围: 可被访问的范围 priva ...
深色模式下文章图片过暗
在/themes/butterfly/source/css/_mode/darkmode.styl 大约104行左右 修改关于第106行brightness的值 修改前值为0.5,效果: 修改之后值为1,效果:
图片资源压缩指南
图片资源压缩指南在p站等图片网站下载的原图作为网站背景文件太大,动辄十几mb,加载很慢 先本地图片编辑,将图片尺寸缩小(一般1080p~2k大小作为背景就很够用了),实现第一步减小体积 使用图片压缩网站或者软件进行进一步压缩,这里有两个网站 压缩图片分为有损压缩和无损压缩。无损压缩推荐Tinypng,有损压缩推荐imagine。 TinyPNG Imagine 特点 无损压缩 有损压缩,以牺牲图像质量, 降低图像色彩来达到缩减图像大小的目的。 优点 能够完全保留图像色彩,不损伤图像质量 1. 压缩程度高,支持转png为jpg或webp,进一步减少图片大小 2. 软件支持一次处理多张图片,无上限,处理完成支持直接批量覆盖原文件或重命名 缺点 单次仅能上传20张图片,每张限制大小为5MB,无法处理更大图片。 PNG转其他格式为不可逆操作(指覆盖保存后),且可能反而会增加图片大小。 个人比较推荐无损压缩的网站
网址不支持某些字符
网址不支持一些特殊字符,比如+ &等 如果在分类或者标签中添加了这类字符,在网址中是无法显示字符的,只会显示可以显示的字符 比如有一个标签是C,一个标签是C++,网址无法识别++,会把++略去,点击C++的时候打开的路径就变成了C的 但只是网址不支持,不涉及网址的地方是没问题的
数据结构_二叉树(C++
数据结构_二叉树(C++实现 1前言:此类笔记仅用于个人复习,内容主要在于记录和体现个人理解,详细还请结合bite课件、录播、板书和代码。 [toc] 前言 本篇中的是一般二叉树(包括线索树、表达式树)是通过链式结构实现的,关于顺序结构的实现请见C语言版(顺便有堆的相关内容) 本篇中哈夫曼树的结点存储是用的是顺序结构 模版不支持分离编译,因此跟以往自定义变量和函数时,声明在头文件、实现在源文件不同,定义(声明+实现)都是在头文件中【详见code日记】 二叉树采用链式存储 二叉树类的声明:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114#pragma once//模版 ...
数据结构_KMP算法
数据结构_KMP算法 前言:此类笔记仅用于个人复习,内容主要在于记录和体现个人理解 [toc] 应用场景 有两条字符串,一条长,一条短,现在要求检查长的字符串,看看里面是不是包含短的字符串,如果包含,就返回短串的首元素在长串中的位置。如果没有的话,就返回-1。长串称为“主串”,短串称为“模式串”,简称“模式”。(不知道为啥这么叫,感觉有点抽象 为了解决这个问题,就诞生出了一种算法:BF算法(暴力算法) 指针i指向主串,j指向模式串 从主串的第一个元素、模式的第一个元素开始遍历,比较,如果相等,i、j后移,看后面的元素是否也都一样。如果在一个地方遇到了i、j指向的元素不同的情况,就称为“失配”,说明从主串第一个元素、模式第一个元素开始的话两个字符串没办法匹配 那么就让i起始位置变成主串的第二个元素,j起始位置指回模式的第一个元素(称为“回溯”),进行第二次遍历,看能否匹配上模式串。 直到,找到能完全匹配的情况下i的起始位置,或者,i的起始位置的剩余长度小于模式的长度(此时肯定没法匹配了,因为长度都不够了) 例如下面👇 在此处,失配了,所以要进行回溯,i的初始位置变成第 ...