自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 线程 - 线程优缺点、线程自有和共享的数据、多线程使用公共空间、线程分离、线程库对线程的管理

在上面的【四、2. 线程自有的数据】部分,我们提及了线程有独立栈结构,现在我们看到它了, 线程的栈结构是在库中维护的,每个线程都有自己的独立栈结构,主线程使用的是地址空间中的栈空间,叫主线程栈。多线程切换有成本,像上面的计算密集型应用,线程过多可能会有较大的性能损失(增加了额外的同步和调度开销,而可用资源不变)。而进程创建的时空成本是较高的,有各种数据结构的创建,数据的加载。让两个线程进同一个线程函数,打印同一个临时变量的地址,是不一样的,说明使用的是不同的栈结构。而线程占用的都是一份的。

2024-09-18 23:40:36 781

原创 报错 - undefined reference to `main‘

/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':(.text+0x24): undefined reference to `main'collect2: error: ld returned 1 exit statusmake: *** [makefile:2: test] Error 1错误

2024-09-16 20:21:04 325

原创 线程 - 线程的由来、进程和线程的关系、线程创建_等待_退出详解

但线程的库可不是必须的,用不到线程部分的程序在编译时就不需要链接原生线程库,你用线程的才需要这个库,所以既然不是必须的,那就交给用户手动链接了。我们的代码在进程中,全都是串行调用的,创建进程,是为了多执行流并发执行,所以创建进程和创建线程都可以,但是显然创建一个线程的成本要低得多啊!的设计者认为,进程和线程都是执行流,有很高的相似性,没必要单独设计数据结构和算法,可以直接复用代码,使用进程来模拟线程。所以线程算是包含在进程中的。的线程模块是复用的进程的,而也有单独设计线程模块的系统,这个系统叫。

2024-09-14 17:30:02 924

原创 VScode 怎么缩放界面大小

界面缩放的颗粒度及相关的些设置,可以在。

2024-09-14 10:20:51 320 2

原创 进程地址空间

从上面几点,我们可以解释之前提出的问题了:【不同的两个。

2024-08-31 14:43:45 803

原创 文件系统 -文件的基本了解

每种硬件都用统一的结构体对象描述,这样就可以统一的管理这些硬件了,将这些对象使用某种数据结构链接起来,对这些硬件的管理就可以转变为对数据结构的增删查改了。那么,一个进程是可以打开多个文件的,一段时间内,系统中又会有很多进程,所以系统需要将这些进程打开的文件进行管理,方法是:先描述,后组织。所以按照文件是否被加载到内存中,可以将文件分类:内存文件(被打开的),磁盘文件(未被打开的)。如果要打开的文件存在就打开,不存在就创建一个再打开,然后将文件内容清空,再写入内容。文件中写了些什么,就属于文件的内容了。

2024-08-26 19:03:16 944

原创 表达式求值 - 整形提升和截断

为了获得这个精度,表达式中的字符类型和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升。截断和整形提升一般会同时出现,而且很容易被忽略,下面通过一个示例来具体了解一下截断和整型提升。截断指的是长字节类型在转换成长字节类型时,进行的取部分比特位的现象。为了方便描述,将上面的几行代码进行了标号,下面我们一部分一部分的看。C语言的整形算数运算总是至少以缺省整形类型的精度来进行的。进制数字,但此时我们得到的值的补码,要想得到。类型的,所以赋值时由于类型转换会发生的截断。截断是对补码进行的操作,而。

2024-08-21 17:53:24 759

原创 make/Makefile - ACM 时间及 make 的检查更新

一个可执行程序需要多个源文件链接,编译链接文件后形成了可执行程序,但后面修改了几个源文件,需要再次编译链接形成一个新的可执行程序,但再次编译时,它会只编译那几个改动过的源文件,形成新的。某个源文件中代码有点问题,运行结果出错,改动后,重新编译后运行仍然出错,可能是因为没有很好的识别时间(文件多)/其他问题,导致仍然链接的是旧的。修改时间(Modify)指的是对文件的内容进行了修改后,紧跟着更新的时间。的新了,此时不再显示是最新状态了,可以重新编译了,所以对比的其实是。从之前的图片中,我们也能看到当使用。

2024-08-19 16:22:15 868

原创 类和对象 - 构造函数

month = 1;_day = 1;_day = day;int _month;int _day;从上述可见,构造函数可以重载。🥝Date d1;Date d1();// 错误无参调用不可以带括号,因为这样的话,就无法与函数声明分开了,这个调用可以看作名为d1的函数的声明,返回值是Date。🧩。

2024-08-18 11:19:00 921

原创 make/Makefile -基本使用

e执行一条指令时,先看当前的依赖方法,依赖方法没有办法实现的话,会递归向下,直到能够完成最初的依赖方法,再逆向执行依赖方法,这属于一条指令。是在自己当前目录下需要手动构建的一个文件,保存的是依赖关系和依赖方法。文件的,默认形成的是第一个目标文件,所以第一个可以直接使用。自动将各个源文件编译,然后链接了,不用我们操心了。这个的依赖文件列表为空,不需要依赖任何文件。在开头定义,且等号左右不能加空格,使用时用。文件,然后全部链接,形成一个可执行程序,形成目标文件的时候,默认是从上到下扫描。

2024-08-17 21:34:56 1129

原创 环境变量 - main()函数和命令行参数

给我们打印出来的命令行字符串,起提示作用,提示我们在此处输入命令,然后是。因为想要通过不同的选项,让同一个程序执行它内部的不同代码,从而实现不同功能。函数是有参数的,虽然现在我们一般不写,但它是可以有的。本文到这里就结束了,如果对您有帮助,希望得到一个赞!是硬性要求,所以几乎所有的语言都要支持命令行参数。函数,通过不同的选项就可以执行不同的命令了。数组中的内容跟我们在命令行输入的内容有关。等指向的是选项,要注意一点的是该表必须以。指向的字符串是路径+可执行程序,而。则是表示该数组中元素的个数。

2024-08-17 17:09:55 275

原创 vim - vim模式及部分操作

vim是一款多模式的编辑器。vim中有很多子命令来进行代码的编写操作。同时,vim提供了不同的模式供我们选择。在vim下的底行模式下通过可以查看所有模式。linux下的部分模式如下:总计12种模式,6种基本模式,6种新增模式。

2024-08-16 12:20:46 452

原创 Windows11 环境变量的位置

Windows11中查看环境变量

2024-08-14 13:49:33 299

原创 进程 - 进程状态总览

本文到这里就结束了,如果对您有帮助,希望可以得到您的一个赞,如果错误,欢迎指正。会被操作系统变迁到不同的队列(运行队列,等待队列)中。阻塞状态是一种什么状态呢?下面通过一张图来认识一下。所以,正如前文所说的:状态的改变引起的是进程的。是指将进程信息写入到外设中,当使用时再写入进来。是一种在计算机资源比较吃紧时会出现的状态。当内存资源吃紧时,将阻塞进程的代码和数据。,或内存大小,不能超过内存大小的二倍。R状态:已经准备好随时被调度了。当需要运行程序时,将代码和数据。

2024-08-09 21:31:47 231

原创 Linux 下的进程状态

本文到这里就结束了,如果对您有帮助的话,可以给个赞支持一下哦,如果有哪里有错误,欢迎指正。):僵尸状态,进程已经执行完毕,但并未获得进程退出的相关信息时的状态。有些进程被禁止做某些操作,但如果进程硬要这样干,进程就会被暂停。会自动读取,所以我们没有手动读取程序的结束信息也没有内存泄露。一般父进程是不会自动读取子进程的结束信息的,但。而大部分进程都会与外设有关,会有等待的状态。都会维护一个自己的运行队列(一个。信号进行进程的手动暂停和继续。:进程已经准备好随时被调度了。

2024-08-09 20:32:10 895

原创 计算机存储单位

bit , B , KB , MB , GB , TB ...

2024-08-01 18:42:01 240

原创 C++ - 模板

中class可以用typename代替。推演实例化:Swap(a,b);Swap(c,d);不能推演成两个类型:显式实例化:int(a,b);//类模板示例public:和是不同的类型,显示实例化的类型不同,他们就是不同的类。当编译器遇到一个模板定义时,不会生成代码,只有在遇到实例化语句时,才根据模板定义生成实例代码,此时,编译器需要知道模板的定义。(后面有详细说明)类内:跟没有模板的类没有区别class A。

2024-06-13 21:12:19 561

原创 浮点型在内存中的存储

本文到此就结束啦,如果有帮助到您,希望可以得到您的一个赞!因为任意一个二进制浮点数都可以表示成上述形式,所以存储一个浮点数,只要存。这样做的目的,是节省1位有效数字,多一位来放小数部分,精度会提高。在转为二进制时,因为小数权重的原因,可能永远没法碰巧凑为。所以,为了解决这个问题,IEEE 754规定,存入内存时。浮点数有两种表示方法,一种是直接写出来的小数,如。的正负,都要加中间数,只是这种操作是为负数的。,小数点可以移动,所以叫浮点数。可以看到,二进制整数部分的权重是,,因此可以被舍去,只保存后面的。

2024-06-13 19:07:08 1050

原创 整数在内存中的存储

数组类型,类类型(结构体类型),枚举类型,联合体类型。

2024-06-12 23:38:31 913

原创 C2065:“_tables”: 未声明的标识符

说明不是该类型的问题,而是中间过程有错误,导致查找时,无法查到末尾的 vector ,所以识别不了前面用到的 _tables。仔细检查发现是类中有一个函数语法有错误,改正后,错误解决。在实现哈希表时,HashTable 类中有定义成员变量。,但是VS显示识别不了这个符号。

2024-06-11 10:45:56 109

原创 C3892 “_Hole”: 不能给常量赋值

是由于对 vector 作了限制,vector 是无法被修改的,而。使用 sort() 给 vector排序时出现这个问题。

2024-04-28 17:56:10 124

原创 类和对象-类基础详解

分离:指的是成员函数定义写在了类外;注意要在函数前标明类域。未分离:指的是成员函数直接在类中定义;默认直接在类中定义的函数是内联函数。正确的用法:短小的函数可以直接在类内定义,较长的函数就声明和定义分离。🍃开空间的地方是定义,言明类型的是声明。!!🧡。

2024-01-14 00:40:10 928 1

原创 程序环境详解(翻译环境)

程序环境包括翻译环境和执行环境。计算机可以识别二进制指令,而我们写的代码时文本信息,计算机无法识别,需要翻译环境进行翻译后,计算机才能识别运行。执行二进制指令。

2023-09-18 11:16:01 128

原创 C语言函数详解

与库函数的区别就是,函数的名称,形参,返回值类型都可以自己定义。(自己的函数,想叫什么名字叫什么名字,想设置几个参数就设置几个参数)传递给函数数据,不改变实参传递给函数地址,可以改变实参看是否需要改变实参的值,需要改动就定义址传递函数,不需要就定义值传递函数。函数定义:创建某个函数。(盖房子)函数调用:使用某个函数。(住进房子里)函数嵌套定义:在一个函数中定义一个函数。该代码是在 main() 函数中,定义了一个名为 hell() 的函数。

2023-07-03 23:09:33 4283 2

原创 喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水

empty 经过处理后是手里剩下的瓶子数(因为加了 %2 的瓶数)并不等于实际上这次喝的汽水数,所以结果会错误。当我们的钱数为 20 元时,最多是喝到 39瓶汽水的。

2023-06-04 18:36:51 169

原创 strlen()函数的实现,应用:求字符串长度,字符(数字)数组内数组个数

所以,在 ret 计数了一个之后,会往后走一步,走 1 个字节,走到第二个紫色格子处,而第二个紫色格子里放的是0,(因为每种颜色的格子是一个 int 变量的 4 个字节,即,紫色的 4 个格子是 c1[0] 的 4 个字节,而 c1[0] 是 1,1 占用不了全部的 4 个字节,只占用了 1 个字节,所以后三个紫色格子是0),strlen()碰到 0 就结束计数了,所以打印出来的结果是 1。当 c1[0] 数字足够大的时候,分配给它的 4 个字节里都不会是 0 了,此时用 strlen()就不会是 1了。

2023-05-30 20:15:25 1581

原创 对二进制位进行操作的操作符:&(按位与), |(按位或) , ^(按位异或) ,~(按位取反)

双目操作符:& , | , ^单目操作符:~,<<,>>都是对二进制的进行运算的!!!

2023-05-30 19:31:28 67

原创 字符数组的初始化,赋值(字符串)

字符数组的初始化,赋值,字符串定义

2023-05-30 19:01:50 1223

原创 数组名arr和&arr的区别

arr:表示整个数组的地址(数值上 == 首元素地址,但意义并不相同)定义:int arr[4] = {1,2,3,4};arr+1:跳过第一个元素,第二个元素的地址。&arr+1:跳过整个数组,下面内存的地址。arr:表示数组元素首地址。

2023-05-26 22:18:27 345

原创 打印出数字的 2,8,16进制

VS认为该函数不安全,改为 _itoa(),要使用_itoa(),需要增加预处理,同时在文件开头加上宏定义。以转为10进制字符串为例:将变量 i 的数字,转化为10进制的字符串,存放到数组 buffer 中。打印进制无限制,但打印出来的不再是数字,而是字符串了。打印出8,10,16进制,无法打印数字的二进制形式。头文件:#include头文件:#include1.VS中使用itoa()函数有限制。一,printf()

2023-05-26 21:37:54 186

原创 用 sizeof 和 strlen()获得字符数组的长度

用 sizeof 求出的是创建数组时,开辟的空间的大小,而 strlen()是求字符串长度的,从首地址开始,到‘\0'结束。sizeof 是关键字,而 strlen()是库函数(需要包括头文件 #include<string.h>)。① 定义字符数组:char str[ ] = “welcome to wuhan!用 sizeof 求出的数组长度是 10,而用 strlen()求出的是 4。strlen()求字符数组长度:不包括结束标志 '\0';sizeof 求字符数组长度:包括结束标志'\0';

2023-05-24 13:16:43 302 1

原创 用 sizeof 获得数组元素个数

② 用上述三个公式,得到的是 10,而不是 5 ,因为 sizeof 计算的是开辟的空间,而不是数组内初始化了几个元素(或者,用了几个数组内的元素)。此处,sizeof(arr)是16个字节,而 sizeof(arr[0])是 4 个字节大小。sizeof(arr)中,arr表示整个数组,而不是数组首元素的地址。① 定义数组: int arr [10] = {1,2,3,4,5};① 定义整形数组:int arr[ ]= {1,3,4,5};

2023-05-24 11:53:12 1924 2

原创 统计二进制中 1 的个数(负数判断补码中 1 的个数)

判断 m 中二进制中1的个数,用 count 计数 1 的个数,用 %2 得到末位,用 /2 得到本次判断过后能接着用 %2 得到下一次末位的数,一旦 m 变成了 0,就判断完了,不必再继续了。-1在内存上存的就是32个 1 ,但因为传给一个unsigned int 类型,所以把这32个 1 当做无符号数,就没有原反补的概念了,直接就是一个很大的正数,可以统计出32个1。看后3位,是从后面第三个开始借的,所以结果以后,上下两排的后三位就完全错开了,所以&后,就全变成 0 了。无法判断负数中的 1 的个数。

2023-05-22 18:45:51 209 1

原创 =(赋值)和 ,(逗号表达式)的优先级

比 ,的优先级高。

2023-05-22 18:21:53 460 1

原创 ++和*(解引用)的优先级

前置++:++和*的优先级相同。(优先级相同的时候,看结合性,两者都是都是从右到左的结合性)后置++:++的优先级高于*,先算++部分。

2023-05-22 18:18:50 2127 1

原创 三子棋游戏,代码(几子棋可以自己设置)

此处用循环来实现,在电脑和玩家都没赢的时候,两方会一直下棋,所以用循环,至于循环条件,我们没用循环条件,而是用了break再合适的时机结束程序,(合适时机:判断输赢的函数,返回值,如果是 ‘C’:两方都没赢呢,‘Q’:平局了,‘*’:玩家赢了,‘#’:电脑赢了,所以当返回值不是‘C'时,那就是肯定有结果了,不用再继续下棋了,我们就可以跳出循环了)。注意:此处涉及 随机函数rand()的应用,rand()要搭配 srand()函数用,而 srand(),又需要time()函数。

2023-05-10 18:07:37 69 1

原创 如何删除CSDN上发布的文章(博客)

④确定删不删除(让你想清楚吧,万一你是不小心点错了呢)① 点击个人头像,进入个人信息网页。③内容管理—>...—>删除。

2023-05-10 15:09:58 800 1

原创 开始(这是一场盛大的结束,也是一场盛大的开始)

② (应用)应用理解——熟练应用——自由应用——高级应用。3.如何学习:①(概念)对每一个知识点都清晰明白,并达到一定的理解深度;2.学习目标:希望有一天可以达到对大部分代码都不会烦恼的境地(自由)1.自我介绍:武汉某所大学,22级学生,来自河北,对武汉适应良好。③(总览)知识串联——应用串联。4.投入时间:每一部分在达到我的要求目标后不再投入时间。5.想去的公司:微软。

2023-04-02 12:17:50 129

原创 Gitee(码云)的创建及托管

(指的是,将上方所指的远程仓库存到‘测试getee’的文件中,test-function是远程仓库的名字。④将本地代码写到该文件中(新建项目的存储地址填test-function)仓库链接:https形式的链接和ssh形式的链接(一般用https的)①找到要提交的代码项目的文件夹所在界面,右击找add,后点OK。①找到本地要存储远程仓库文件的文件夹。②右键找到Git Clone,点击。③添加描述后,点commit。在gitee上创建仓库。②在后续界面点commit。success后点ok即可。

2023-04-02 11:28:16 192 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除