C/C++
文章平均质量分 61
随便写点
heater404
这个作者很懒,什么都没留下…
展开
-
【C】分配内存的函数
函数不是在堆上分配空间,而是在调用者函数的栈帧上分配空间,类似于C99的变长数组,当调用者函数返回时自动释放栈帧,所以不需要。返回新内存空间的首地址,并释放原内存空间。新内存空间中的数据尽量和原来保持一致,如果。分配一块新的内存空间,把原内存空间中的数据拷到新的内存空间,然后调用。比原来大,则原来的数据全部保留,后面长出来的一块内存空间未初始化(分配的内存空间使用了一段时间之后需要改变它的大小,一种办法是调用。函数简化了这些步骤,把原内存空间的指针。个字节不变,后面的数据被截断,如果。是请求分配的字节数,原创 2023-03-03 17:45:49 · 299 阅读 · 0 评论 -
【C】数值字符串转换函数
【代码】【C】数值字符串转换函数。原创 2023-03-03 17:02:31 · 102 阅读 · 0 评论 -
【C】标准IO库函数
可正可负,负值表示向前(向文件开头的方向)移动,正值表示向后(向文件末尾的方向)移动,如果向前移动的字节数超过了文件开头则出错返回,如果向后移动的字节数超过了文件末尾,再次写入时将增大文件尺寸,从原来的文件末尾到。表示二进制文件,有些操作系统的文本文件和二进制文件格式不同,而在UNIX系统中,无论文本文件还是二进制文件都是由一串字节组成,),如果字符串被截断,返回的是截断之前的长度,把它和实际缓冲区中的字符串长度相比较就可以知道是否发生了截断。指定了缓冲区长度,如果格式化后的字符串长度超过缓冲区长度,原创 2023-03-03 16:51:03 · 453 阅读 · 0 评论 -
【C】字符串操作函数
在一个长字符串中从前到后找一个子串(Substring),找到子串第一次出现的位置就返回,返回值指向子串的开头,如果找不到就返回NULL。函数则不存在这个问题,它的内部没有静态变量,调用者需要自己分配一个指针变量来维护字符串中的当前处理位置,每次调用时把这个指针变量的地址传给。字符,或者说这些函数并不把参数当字符串看待,因此参数的指针类型是。第一次出现的位置时就返回,返回值指向这个位置,如果找不到字符。段),如果它是函数的局部变量,则初值不确定,可以用。个字节全都一样就返回0,如果遇到不一样的字节,原创 2023-03-03 10:30:31 · 316 阅读 · 0 评论 -
【C】线程间同步
但是如果锁的竞争激烈,或者持有锁的线程需要长时间占用锁执行同步块,这时候就不适合使用自旋锁了,因为自旋锁在获取锁前一直都是占用 cpu 做无用功,占着 XX 不 XX,同时有大量线程在竞争一个锁,会导致获取锁的时间很长,线程自旋的消耗大于线程阻塞挂起操作的消耗,其它需要 cpu 的线程又不能获取到 cpu,造成 cpu 的浪费。如果一个线程既想获得锁,又不想挂起等待,可以调用pthread_mutex_trylock,如果Mutex已经被另一个线程获得,这个函数会失败返回EBUSY,而不会使线程挂起等待。原创 2023-03-01 17:12:15 · 533 阅读 · 0 评论 -
【C】线程控制
这个类型有不同的实现,它可能是一个整数值,也可能是一个结构体,也可能是一个地址,所以不能简单地当成整数用。状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。都可以把该线程设置为detach状态,也就是说,不能对同一线程调用两次。我们可以看到,线程1和线程2的终止与我们的预期一样,但是线程3使用。一般情况下,线程终止后,其终止状态一直保留到其他线程调用。,它只在当前进程中保证是唯一的,在不同的系统中。,这个指针的函数的含义同样由调用者自己定义。:成功返回后,新创建的线程的id被填写到。原创 2023-02-28 18:42:32 · 528 阅读 · 0 评论 -
【C】main函数的参数传递
main函数可以从命令行获取参数,从而提高代码的复用性。原创 2023-01-29 17:33:29 · 1895 阅读 · 1 评论 -
【C】函数接口---二级指针参数和指针返回值
指针就是指向内存地址的变量,二级指针也是指针,即指向指针的指针,同样可以表示传入参数、传出参数或者Value-result参数,只不过该参数所指的内存空间应该解释成一个指针变量。原创 2023-01-16 17:23:15 · 497 阅读 · 0 评论 -
【C】二级指针参数
指针就是指向内存地址的变量,二级指针也是指针,即指向指针的指针,同样可以表示传入参数、传出参数或者Value-result参数,只不过该参数所指的内存空间应该解释成一个指针变量。原创 2023-01-16 17:17:49 · 373 阅读 · 0 评论 -
【C】 extern和extern “C“
extern “C”的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern “C”后,回指示编译器这部分代码按C语言的进行编译,而不是C++的。例如a.c文件中定义了int a=5和一个函数,在a.h里写extern int a;如果要在其他文件里调用a这个变量和函数,直接#include即可。调用其他c文件中的变量,不如将该变量封装成函数提供其他地方调用,然后将改变了加上static。原创 2023-01-16 11:31:03 · 111 阅读 · 0 评论 -
VS中使用动态库
VS中使用动态库。原创 2022-07-25 15:42:01 · 2631 阅读 · 0 评论 -
container of()函数简介
container_of简介翻译 2022-06-21 19:44:43 · 368 阅读 · 0 评论 -
关于宏的二三事
宏定义函数式宏定义#define N 20#define STR ”hello world“上述的宏定义称为变量式宏定义,宏定义可以像变量一样在代码中使用。另外一种宏定义可以像函数调用一样在代码中使用,称为函数式宏定义。#define MAX(a,b) (((a)>(b)?(a):(b)有几点需要强调:函数式宏定义的参数没有类型,预处理只负责做形式上的替换,而不做参数类型检查。调用真正函数的代码和调用函数式宏定义的代码编译生成的指令不同。如果MAX是一个真正的函数,那么它的函数体原创 2022-04-22 16:26:54 · 174 阅读 · 0 评论 -
【C】 字符串函数sprintf()和snprintf()
sprintf()函数详解int sprintf( char *buffer, const char *format , … );函数说明:将格式化的字符串输入到buffer中。函数返回值:buffer的长度。sprintf和printf在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。 char buffer[100]; int ret = sprintf(buffer, "I am hhh"); printf("ret: %d buffer: %原创 2022-04-18 15:18:34 · 1753 阅读 · 0 评论 -
【C++】 function
1 简介std::function是一个函数包装器,包含在头文件#include 中。该函数包装器模板能包装任何类型的可调用实体,如普通函数、函数对象、lambda表达式。2 举例2.1 包装非成员函数、函数指针#include <functional>int foo(int i){ return i * i;}int (*foo_ptr)(int) = foo;int main(int, char **){ std::cout << "====原创 2022-02-22 10:56:57 · 4212 阅读 · 0 评论 -
【C++】多线程同步
线程间的同步方法大体可以分为两类:用户模式和内核模式。内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。用户模式下的方法有:原子操作(例如一个单一的全局变量)、临界区。特点是:同步速度特别快。内核模式下的方法有:事件、信号量、互斥量。同步速度较慢,但适用性比较好。**临界区:**通过对多线程的串行化来访问公共资源或一段代码、速度快,适合控制数据访问。**互斥量:**为协调共同对一个共享资源的单独访问而设计的。*原创 2022-02-21 19:07:10 · 6831 阅读 · 0 评论 -
【C++】:shared_ptr和unique_ptr
智能指针的行为类似常规指针,重要的区别是它负责自动释放所指向的对象。std::unique_ptr:独占资源所有权的指针。std::shared_ptr:共享资源所有权的指针。1 std::unique_ptr当我们独占资源的所有权的时候,可以使用std::unique_ptr对资源进行管理,一旦离开unique_ptr对象的作用域时,会自动释放资源。 //初始化unique_ptr必须采用直接初始化形式 std::unique_ptr<int> p1;原创 2022-02-17 12:00:12 · 577 阅读 · 0 评论 -
【C++】类型转化
1 static_cast静态类型转换 double pi = 2.1415926; int a = pi; //隐式转换 int b = (int)pi; //C语言风格旧式类型转换 //在编译的时 进行基本类型的转换 能替代c风格的类型转换 可以进⾏行一部分检查 int c = static_cast<int>(pi); //静态类型转换2 dynamic_cast子类与父类之间的多态原创 2022-02-16 17:49:12 · 286 阅读 · 0 评论 -
【C++】时间相关
1 定义时间单位 std::chrono::minutes minut{2}; // 2 minutes std::chrono::seconds sec{3}; // 3 seconds std::chrono::milliseconds mills{500}; // 500 milliseconds auto dul = sec - mills; //两者差值,单位默认转换为较小的 std::cout << "dul.原创 2022-02-16 14:44:52 · 780 阅读 · 0 评论 -
【C++】 多线程
C++ 多线程1 创建线程std::thread类中的成员函数:函数名作用get_id获取线程ID,返回一个类型为std::thread::id的对象joinable检查线程是否可被joinjoin调用该函数会阻塞当前线程。阻塞调用者(caller)所在的线程直至被join的std::thread对象标识的线程执行结束。detach将当前线程对象所代表的执行实例与该线程对象分离,使得线程的执行可以单独进行。一旦线程执行完毕,它所分配的资源将会被释放。原创 2022-02-16 10:44:19 · 1340 阅读 · 0 评论 -
【C++】stdref和stdcref
std::ref和std::cref1 std::ref和std::crefc++11中引入std::ref用于取某个变量的引用,这个引入是为了解决一些传参问题。std::ref用于包装按引用传递的值。std::cref用于包装按const引用传递的值。我们知道C++中本来就有引用的存在,为何C++11中还要引入一个std::ref呢?主要是考虑函数式编程(如std::bind)在使用时,是对参数直接拷贝,而不是引用。#include <iostream>#include &l原创 2022-02-15 17:03:18 · 401 阅读 · 0 评论 -
【C++】 左值和右值
C++ 左值和右值1 概念在C++或者C语言中,一个表达式(可以时字面量、变量、对象、函数的返回值等)根据其使用场景不同,分为左值表达式和右值表达式。确切的说C++中左值和右值的概念时从c语言继承过来的。左值的英文简写为“lvalue”(locator value):意为存储在内存中,有明确存储地址(可寻址)的数据。右值的英文简写为“rvalue”(read value):指的是那些可以提供数据值的数据(不一定可以寻址,例如存储于寄存器中的数据)。判断某个表达式是左值还是右值的方法:可位于赋原创 2022-02-15 12:20:04 · 519 阅读 · 0 评论 -
零长度数组
零长度数组1 零长度数组概念GCC/GNU在标准的C/C++基础上做了又实用性的拓展,零长度数组就是其中一个知名的拓展。多数情况下,其应用在变长数组中,其定义如下: typedef struct { uint32_t length; uint8_t payload[0];//这里的0长结构体就为变长结构体提供了非常好的支持。 } packet;首先对0长度数组,也叫柔性数组,做一个解释:用途:长度为0的数组的主要用途就是为了满足需要变长度的原创 2022-02-14 15:26:25 · 533 阅读 · 0 评论 -
【C++】string的常用函数用法总结
C++string的常用函数用法总结1 string的构造函数的形式string str1 = "123re23r"; std::cout << str1 << " addr:" << &str1 << endl;//123re23r addr:0x9c88dff860 string str2(str1); std::cout << str2 << " addr:" << &st原创 2022-02-12 16:07:01 · 344 阅读 · 0 评论 -
【C++】nlohmann json
1简介github地址:nlohmann/json: JSON for Modern C++ (github.com)2集成在release中下载json.hpp文件即可。然后将该文件加载到项目中使用。3使用这里,我们主要介绍自定义对象的序列化和反序列化为json格式,所以我们需要定义一个数据结构。#pragma onceusing namespace std;#include <string>#include "../json/json.hpp"using namespa原创 2022-02-11 16:30:20 · 1827 阅读 · 0 评论 -
VSCode+mingw64+cmake
cmake简介cmake安装:Download | CMake。在这之前,我们介绍一下cmake。虽然Make和Makefile简化了手动构建的过程,但是编写Makefile文件仍然是一个麻烦的工作,因此就有了CMake工具。CMake工具用于生成Makefile文件,而如何生成Makefile文件,则由CMakeLists.txt文件指定。它们直接的关系如下图:使用cmake生成Makefile并编译的流程如下:编写CMake配置文件CMakeLists.txt。执行命令 cmake pat原创 2022-01-25 16:08:02 · 1512 阅读 · 0 评论 -
【C++】内存管理
C++内存管理一、内存四区内存四区分为:栈区:存储一些临时变量的区域,临时变量包括了局部变量、返回值、参数、返回地址等,当这些变量超出了当前作用域时将会自动弹出。该栈的最大存储是有大小的,该值固定,超过该大小将会造成栈溢出。栈的顶部为地址的最小索引,栈中变量是先进后出。堆区:是一个比较大的内存空间,主要用于对动态内存的分配;在程序开发中一般都是开发人员进行分配与释放,若在程序结束时都未释放,系统将自动进行回收。数据区:主要存放全局变量、常量和静态变量的区域,数据区又可以进行划分,分为全局区与静态原创 2022-01-05 18:51:40 · 793 阅读 · 1 评论 -
【C++】指针
C++指针一、什么是指针指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址。 int* ip; //一个整形的指针 double* dp;//一个double类型的指针 float* fp;//一个浮点型的指针 char* cp;//一个字符型的指针所有指针的值的实际数据类型,不管是整形、浮点型、字符型还是其他的数据类型,都是一样的,都是一个代表内存地址的长的十六进制数。不同数据类型的指针之间唯一的不同是,指针所指向的变量或常量的数据类型不同。指针的值实质是内存单元(即字节)的原创 2021-12-31 11:57:11 · 100 阅读 · 0 评论 -
【C++】引用
一、概念引用变量是一个别名,也就是说,它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量,就可以使用该引用名称或变量名称来指向变量。二、引用和指针不存在空引用。引用必须连接到一块合法的内存。一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。引用必须在创建时被初始化。指针可以在任何时候被初始化。三、创建引用试想变量是变量附属在内存位置中的标签,您可以把引用当成是变量附属在内存位置中的第二个标签。因此,您可以通过原始变量名称或引用来访问变量的内容原创 2021-12-25 18:07:47 · 761 阅读 · 0 评论