笔记
不会编程喵
靡不有初,鲜克有终。
展开
-
ARM-ASM汇编指令
方式三:带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址,同时将跳转指令下一条指令的地址存储到LR寄存器。@ 2.4 当函数的参数不多于4个时使用R0-R3传递,当函数的参数多于4个时,多出的部分用栈传递。@ 第二操作数中的哪一位为1,就将第一操作寄存器的中哪一位清零,然后将结果写入目标寄存器。@ 方式二:不带返回的跳转指令,本质就是将PC寄存器的值修改成跳转标号下指令的地址。@ MRC 将协处理器中寄存器中的数据传送到ARM处理器中的寄存器。原创 2022-11-28 18:29:45 · 985 阅读 · 3 评论 -
在线词典项目
【代码】在线词典项目。原创 2022-11-22 15:49:20 · 238 阅读 · 0 评论 -
十分钟轻松掌握sqlite3轻量级数据库的使用
callback 回调函数,只有在查询时,才传参。返回值:成功为0 SQLITE_OK ,出错 错误码。返回值:成功为0 SQLITE_OK ,出错 错误码。参数:arg 接收sqlite3_exec 传递来的参数。.schema 查看表的结构。1)系统命令 , 都以'.'开头。errmsg 错误消息。f_value 列的值得地址。3-- 查看数据库记录。f_name 列的名称。2-- 插入一条记录。4-- 删除一条记录。5-- 更新一条记录。返回值:成功 SQLITE_OK。原创 2022-11-04 14:59:19 · 315 阅读 · 0 评论 -
linu网络编程简述及tcp的简单实现
UDP: (user Datagram Protocol, 用户数据报协议): 提供不可靠,无连接的尽力传输协议。TCP: (Transfer Control protocol,传输控制协议) 提供面向连接的,一对一的可靠数据传输的协议。cp: 点分形式的IP地址,结果是32位整数(内部包含了字节序的转换,默认是网络字节序的模式)(对它执行IO的操作函数,比如,read(),write(),close()等操作函数)mobileIPV6: local IP(本地注册的IP),roam IP(漫游IP)原创 2022-10-26 15:59:37 · 109 阅读 · 0 评论 -
8.信号机制/信号捕捉/信号集操作函数
0:发送信号给跟调用kill函数的那个进程处于同一进程组的进程。< -1: 取绝对值,发送信号给该绝对值所对应的进程组的所有组员。判断一个信号是否在集合中。sa_sigaction: 另一个信号处理函数,它有三个参数,可以获得关于信号的更详细的信息。信号递达(Delivery ):实际信号执行的处理过程(3种状态:忽略,执行默认动作,捕获)SA_NODEFER:使对信号的屏蔽无效,即在信号处理函数执行期间仍能发出这个信号。功能:将进程的屏蔽字替换为由参数sigmask给出的信号集,然后挂起进程的执行。原创 2022-10-22 16:54:14 · 242 阅读 · 3 评论 -
7.两种共享内存的实现
flags:由以下几个常值指定:MAP_SHARED(共享的) MAP_PRIVATE(私有的), MAP_FIXED(表示必须使用 start 参数作为开始地址,如果失败不进行修正),其中,MAP_SHARED , MAP_PRIVATE必选其一,而 MAP_FIXED 则不推荐使用。(4) 用于映射的文件大小必须>0,当映射文件大小为0时,指定非0大小创建映射区,访问映射地址会报总线错误,指定0大小创建映射区,报非法参数错误(Invalid argument)fd:表示要映射的文件句柄。原创 2022-10-21 15:36:23 · 781 阅读 · 10 评论 -
6.进程通信 无名管道 有名管道
对于以只写方式(O_WRONLY)打开的FIFO文件,如果open调用是阻塞的(即第二个参数为O_WRONLY),open调用将被阻塞,直到有一个进程以只读方式打开同一个FIFO文件为止;如果open调用是非阻塞的(即第二个参数为O_WRONLY | O_NONBLOCK),open总会立即返回,但如果没有其他进程以只读方式打开同一个FIFO文件,open调用将返回-1,并且FIFO也不会被打开。),那么或者写入全部字节,或者一个字节都不写入,系统就可以确保数据决不会交错在一起。管道已满,write阻塞。原创 2022-10-20 16:37:14 · 158 阅读 · 6 评论 -
5.线程池的引用
我们平时创建一个线程,完成某一个任务,等待线程的退出。但当需要创建大量的线程时,假设。信号会被多个线程收到,这叫线程的惊群效应。通俗的讲就是一个线程的池子,可以循环的完成任务的一组线程集合。线程池工作线程,它是任务队列任务的消费者,等待新任务的信号。任务队列,存储需要处理的任务,由工作线程来处理这些任务。,使用线程池可以降低频繁创建和销毁线程所带来的开销,应用场景:生产者消费者问题,是线程同步的一种手段。实现任务队列互斥锁和条件变量的初始化。检查函数的参数,添加对应的参数。判断是否有空闲的工作线程。原创 2022-10-14 16:31:45 · 240 阅读 · 4 评论 -
4.线程的取消/清理/互斥锁
在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy()除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。原创 2022-10-14 16:33:54 · 544 阅读 · 4 评论 -
5.文件IO 使用动态库和静态库
或者使用export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的动态库目录。如果path是符号链接stat获取的是目标文件的属性;而lstat获取的是链接文件的属性。test.c:(.text+0x15):对‘hello’未定义的引用。struct dirent是用来描述目录流中一个目录项的结构体类型。gcc -o 目标文件 源码.c -L路径 -lxxxx。DIR是用来描述一个打开的目录文件的结构体类型。1 . 编写库文件代码,编译为.o 目标文件。原创 2022-10-12 19:32:37 · 87 阅读 · 0 评论 -
4.文件IO 打开关闭
英文:缩写fd(file descriptor)0, 1, 2 的含义 标准输入,标准输出,错误。umask 用来设定文件或目录的初始权限。什么是文件IO,又称系统IO,系统调用。是0-1023的数字,表示文件。成功时返回文件描述符;关闭后文件描述符不能代表文件。POSIX接口 (了解)文件IO的读写和定位。原创 2022-10-12 19:27:32 · 122 阅读 · 0 评论 -
3.流的刷新定位 格式化输入 /输出
* 一年中的第几天,范围从 0 到 365 *//* 一月中的第几天,范围从 1 到 31 *//* 一周中的第几天,范围从 0 到 6 *//* 秒,范围从 0 到 59 *//* 分,范围从 0 到 59 */fseek 参数whence参数:SEEK_SET/SEEK_CUR/SEEK_END。原创 2022-10-12 19:24:27 · 364 阅读 · 0 评论 -
2.标准IO的字符输入和输出
2 fgets 函数第二个参数,输入的数据超出size,size-1个字符会保存到缓冲区,最后添加’\0’,如果输入数据少于size-1 后面会添加换行符。2遇到这种错误:Bad file descriptor, 很可能是文件打开的模式错误(只读模式去写,只写模式去读)2 tdin 也是FILE *的指针,是系统定义好的,指向的是标准输入(键盘输入)成功时返回读取的字符;遇到’\n’或已输入size-1个字符时返回,总是包含’\0’文件写完后,文件指针指向文件末尾,如果这时候读,读不出来内容。原创 2022-10-12 19:18:25 · 442 阅读 · 0 评论 -
1.标准IO和文件IO
perror和strerror 功能:打印系统的错误描述(注意:是系统错误,不是你自己代码错误)解决方法:如果是系统变量用include 头文件,如果是你自己的,自己手动定义。如果我们把系统调用封装成库函数就可以起到隔离的作用,提供程序的可移植性。为了减少操作IO设备的次数,提高运行效率,在内存里面设置的缓冲区,以只写方式打开文件,若文件存在则文件长度清为0。Path: 普通文件当前路径不需要加目录,其他要使用完整的路径。以只写方式打开文件,若文件不存在则创建;就是数据的流,在程序中就是一个结构体。原创 2022-10-12 19:11:59 · 381 阅读 · 0 评论 -
3.线程的概念与创建
意义:表示pthread_create参数3的定义和实际代码不符合,期望的是void * (*)(void *) ,实际的代码是int * (*)(char *)arg 传递给routine的参数 ,参数是void * ,注意传递参数格式,注意:pthread_join 是阻塞函数,如果回收的线程没有结束,则一直等待。解决方法:转换为指定的指针类型后再用*取值 比如:*(int *)arg。错误类型:参数不匹配,期望的是char * ,但参数retv是void *错误类型:未知的类型pthead_t。原创 2022-10-12 19:07:29 · 138 阅读 · 0 评论 -
2.进程基础(exec函数族 守护进程 GDB调试工具的使用)
由于在 Linux 中,每一个系统与用户进行交流的界面称为终端,每一个从此终端开始运行的进程都会依附于这个终端,这个终端就称为这些进程的控制终端,当控制终端被关闭时,相应的进程都会自动关闭。参数a表示不仅列当前用户的进程,也列出所有其他用户的进程,参数x表示不仅列有控制终端的进程,也列出所有无控制终端的进程,参数j表示列出与作业控制相关的信息。创建进程之后,子进程和父进程执行相同的代码,但是在实际开发当中,我们希望父子进程执行不同的代码。调用了setsid函数的进程,既是新的会长,也是新的组长。原创 2022-10-12 19:01:45 · 261 阅读 · 4 评论 -
1.进程基础
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。pid原创 2022-10-12 18:54:12 · 343 阅读 · 0 评论 -
C++STL面试详解
动态增加大小时,并不是在原空间后增加新的空间,而是以原大小的两倍在另外配置一片较大的新空间,然后将内容拷贝过来,并释放原来的空间。使用一个下标范围比较大的数组来存储元素。倍的方式扩容,导致下一次申请的内存必然大于之前分配内存的总和,导致之前分配的内存不能再被使用,所以最好倍增长因子设置为。容器,然后把容器复制到共享内存,并且确保所有容器的内部分配的内存指向共享内存中的相应区域,这基本是个不可能完成的任务。个链表,链表的每个节点就是实际的内存块,相同链表上的内存块大小都相同,不同链表的内存块大小不同,从。原创 2022-09-28 16:50:19 · 1425 阅读 · 0 评论 -
说说强制类型转换运算符
如果下行转换是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。安全的,如果下行转换不安全的话其会返回空指针,这样在进行操作的时候可以预先判断。下行转换存在不安全的情况也可以转换成功,但是直接使用转换后的对象进行操作容易造成错误。主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的。原创 2022-09-28 15:52:36 · 429 阅读 · 0 评论 -
说一说c++中四种cast转换
只能用于含有虚函数的类,用于类层次间的向上和向下转化。向下转化时,如果是非法的。它通过判断在执行到该语句的时候变量的运行时类型和要转换的类型是否相同来判断是否能够进行向下转换。的强制转换表面上看起来功能强大什么都能转,但是转化不够明确,不能进行错误检查,容易出错。能用于多态向上转化,如果向下转能成功但是不安全,结果未知;向上转换:指的是子类向基类的转换。向下转换:指的是基类向子类的转换。转指针,可能会出问题,尽量少用;要深入了解内部转换的原理。用于各种隐式转换,比如非。几乎什么都可以转,比如将。原创 2022-09-28 15:51:41 · 179 阅读 · 0 评论 -
模板函数和模板类的特例化
不必为所有模板参数提供实参,可以指定一部分而非所有模板参数,一个类模板的部分特例化本身仍是一个模板,使用它时还必须为其特例化版本中未指定的模板参数提供实参。编写单一的模板,它能适应多种类型的需求,使每种类型都具有相同的功能,但对于某种特定类型,如果要实现其特有的功能,单一模板就无法做到,这时就需要模板特例化。原理类似函数模板,不过在类中,我们可以对模板进行特例化,也可以对类进行部分特例化。特例化时类名一定要和原来的模板相同,只是参数类型不同,按最佳匹配原则,哪个最匹配,就用相应的模板。原创 2022-09-28 15:50:39 · 265 阅读 · 0 评论 -
为什么析构函数一般写成虚函数
由于类的多态性,基类指针可以指向派生类的对象,如果删除该基类的指针,就会调用该指针指向的派生类析构函数,而派生类的析构函数又自动调用基类的析构函数,这样整个派生类的对象完全被释放。如果析构函数不被声明成虚函数,则编译器实施静态绑定,在删除基类指针时,只会调用基类的析构函数而不调用派生类析构函数,这样就会造成派生类对象析构不完全,造成内存泄漏。所以将析构函数声明为虚函数是十分必要的。在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生,要将基类的析构函数声明为虚函数。原创 2022-09-28 15:49:32 · 1215 阅读 · 0 评论 -
34. 拷贝初始化和直接初始化,初始化和赋值的区别?
34. 拷贝初始化和直接初始化,初始化和赋值的区别?原创 2022-09-28 15:47:59 · 275 阅读 · 0 评论 -
33. C++的顶层const和底层const ?
33. C++的顶层const和底层const ?原创 2022-09-28 15:47:05 · 253 阅读 · 0 评论 -
32. 对c++中的smart pointer四个智能指针shared_ptr,unique_ptr,weak_ptr,auto_ptr的理解
智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。就可以看出了资源可以被多个指针共享,它使用计数机制来表明资源被几个指针共享。它是对对象的一种弱引用,不会增加对象的引用计数,和。在使用引用计数的机制上提供了可以共享所有权的智能指针。时,当前指针会释放资源所有权,计数减一。的操作,要安全的重用这种指针,可给它赋新值。原创 2022-09-24 21:39:54 · 95 阅读 · 0 评论 -
31. 说一说extern“C”
支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;语言代码的函数时不会带上函数的参数类型,一般只包括函数名。在多个人协同开发时,可能有的人比较擅长。的主要作用就是为了能够正确实现。语言并不支持函数重载,因此编译。语言写的,为了更好的支持原来的。后,会指示编译器这部分代码按。语言写的,而且很底层的库也是。这个功能十分有用处,因为在。,这样的情况下也会有用到。出现以前,很多代码都是。就是其中的一个策略。原创 2022-09-24 21:36:51 · 302 阅读 · 0 评论 -
29. 如何避免“野指针”
指针操作超越了变量的作用范围。解决办法:在变量的作用域结束前释放掉变量的地址空间并且让指针指向。指针变量声明时没有被初始化。解决办法:指针声明时初始化,可以是具体的地址值,也可让它指向。解决办法:指针指向的内存空间被释放后指针应该指向。原创 2022-09-24 21:35:51 · 125 阅读 · 0 评论 -
28. C语言的结构体和C++的有什么区别
的类有很大的相似度,但是类是实现面向对象的基础。而结构体只可以简单地理解为类的前身。语言的结构体是不能有函数成员的,而。语言的结构体是没有继承关系的,而。语言的结构体中数据成员是没有。的类的成员有这些访问限定。的类却有丰富的继承关系。原创 2022-09-24 21:34:56 · 417 阅读 · 0 评论 -
27. 设置地址为0x67a9 的整型变量的值为0xaa66
这道题就是强制类型转换的典型例子,绝大部份情况下,地址长度和整型数据的长度是一样的。即一个整型数据可以强制转换成地址指针类型,只要有意义即可。原创 2022-09-24 21:34:14 · 391 阅读 · 0 评论 -
26. 简述队列和栈的异同
26. 简述队列和栈的异同原创 2022-09-24 21:33:26 · 868 阅读 · 0 评论 -
25. 指针常量与常量指针区别
25. 指针常量与常量指针区别原创 2022-09-24 21:32:27 · 113 阅读 · 0 评论 -
24. typedef 和define 有什么区别
24. typedef 和define 有什么区别原创 2022-09-24 21:31:28 · 389 阅读 · 0 评论 -
23. C语言的指针和引用和c++的有什么区别?
23. C语言的指针和引用和c++的有什么区别?原创 2022-09-24 21:30:43 · 552 阅读 · 0 评论 -
22. 请解析((void ()( ) )0)( )的含义
这就是上句的函数名所对应的函数的调用。,无参数,并且起始地址为。,参数为空的函数指针。表示整个是一个返回值为。,参数为空的函数指针。原创 2022-09-23 14:44:56 · 347 阅读 · 0 评论 -
19. 右值引用有什么作用?
右值引用的主要目的是为了实现转移语义和完美转发,消除两个对象交互时不必要的对象拷贝,也能够更加简洁明确地定义泛型函数。原创 2022-09-23 14:43:43 · 265 阅读 · 0 评论 -
18. shared_ptr是如何实现的?
赋值运算符中,左边的对象引用计数减。在赋值运算符和析构函数中,如果减。构造函数中计数初始化为。拷贝构造函数中计数值加。,右边的对象引用计数加。析构函数中引用计数减。原创 2022-09-23 14:43:08 · 59 阅读 · 0 评论 -
17. 什么是智能指针?智能指针有什么作用?分为哪几种?各自有什么样的特点?
实现独占式拥有的概念,同一时间只能有一个智能指针可以指向该对象,因为无法进行拷贝构造和拷贝赋值,但是可以进行移动构造和移动赋值;,实现共享式拥有的概念,即多个智能指针可以指向相同的对象,该对象及相关资源会在其所指对象不再使用之后,自动释放与对象相关的资源;类模型,用于动态分配内存,其设计思想是将基本类型指针封装为(模板)类对象指针,并在离开作用域时调用析构函数,使用。对象所有权的转移,比如在函数传参过程中,对象所有权不会返还,从而存在潜在的内存崩溃问题;,但不会增加对象的引用计数。,从而导致死锁问题。原创 2022-09-23 14:42:36 · 561 阅读 · 0 评论 -
16. 对于一个频繁使用的短小函数,应该使用什么来实现?有什么优缺点?
相比于宏函数,内联函数在代码展开时,编译器会进行语法安全检查或数据类型转换,使用更加安全;在内联函数被调用的地方进行代码展开,省去函数调用的时间,从而提高程序运行效率;如果内联函数内代码块的执行时间比调用时间长得多,那么效率的提升并没有那么大;如果修改内联函数,那么所有调用该函数的代码文件都需要重新编译;内联声明只是建议,是否内联由编译器决定,所以实际并不可控。内联函数内的代码替换到函数被调用的地方。代码膨胀,产生更多的开销;内联函数,即编译器将。原创 2022-09-23 14:41:58 · 471 阅读 · 0 评论 -
15. 简述strcpy、sprintf 与memcpy 的区别
• 操作对象不同,strcpy 的两个操作对象均为字符串,sprintf 的操作源对象可以是多种数据类型, 目的操作对象是字符串,memcpy 的两个对象就是两个任意可操作的内存地址,并不限于何种数据类型。• 执行效率不同,memcpy 最高,strcpy 次之,sprintf 的效率最低。• 实现功能不同,strcpy 主要实现字符串变量间的拷贝,sprintf 主要实现其他数据类型格式到字 符串的转化,memcpy 主要是内存块间的拷贝。「注意」:strcpy、sprintf 与memcpy 都可原创 2022-09-23 14:41:14 · 716 阅读 · 0 评论 -
14. 全局变量和局部变量有什么区别?操作系统和编译器是怎么知道的?
全局变量和局部变量有什么区别?操作系统和编译器是怎么知道的?原创 2022-09-23 14:40:32 · 395 阅读 · 0 评论