![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
zpf1813763637
这个作者很懒,什么都没留下…
展开
-
C++ 通过std::shared_lock(共享锁)和std::shared_mutex(共享互斥量)实现读写锁
std::shared_mutex`(共享互斥锁)和 `std::map` 结合使用的方法。`std::shared_mutex` 支持读写分离的锁策略,允许多个线程并发地读取数据,但在写入数据时会互斥锁定。`writeMap` 函数使用 `std::unique_lock` 来获得独占的写入访问权限,而 `readMap` 函数使用 `std::shared_lock` 来获得共享的读取访问权限。这样,在写入数据时会阻止其他线程的任何访问,而在读取数据时可以允许多个线程同时访问。原创 2023-08-09 17:44:56 · 1928 阅读 · 0 评论 -
使C++动态库导出的符号表和C符号表导出规则一致
C++代码编译成动态库时,由于C++支持函数重载、虚函数表等特性,导致符号名可能被编译器进行了一些修饰,导致C和C++导出的符号不一致。这样,编译器就会按照C语言的命名规则导出这些符号。在使用这些符号的时候,需要通过extern "C"语法来声明这些符号,可以通过在C++代码中使用extern "C"语法来取消符号修饰,使其符合C语言的命名规则,从而和C语言导出的符号表保持一致。具体做法是将需要导出的函数或变量的定义用extern "C" {}包围起来原创 2023-05-10 15:27:13 · 676 阅读 · 1 评论 -
C++结构体分别在:栈空间、堆空间、静态存储区中初始化
C++结构体分别在:栈空间、堆空间、静态存储区中初始化栈空间中存储的结构体变量,其生命周期与定义变量的作用域有关,一旦离开定义变量的作用域,就会被销毁;对于静态存储区中存储的结构体变量,其生命周期与程序的运行周期相同,即从程序开始执行到程序结束;对于堆空间中存储的结构体变量,其生命周期由程序员手动管理,需要在不需要使用时手动释放,避免内存泄漏。原创 2023-05-06 18:00:56 · 1440 阅读 · 0 评论 -
C++有些方法形参没有参数名只有&
函数参数可以通过值传递或引用传递。对于引用传递的参数,在函数定义时可以省略参数名称,只保留引用符号&。这是因为引用是一个别名,它指向传递给函数的实参,因此函数内部可以直接使用它,而不需要复制参数的值。这也提高了程序的效率,因为引用传递避免了参数值的复制。在这个例子中,swap()函数定义中的形参a和b都是引用类型,没有指定参数名称。当函数被调用时,x和y的值被传递给函数,函数内部通过引用a和b来访问它们,并将它们的值交换。注意,调用swap()函数时不需要使用取地址符&,因为参数已经是引用类型了。需要注原创 2023-04-07 23:46:53 · 729 阅读 · 1 评论 -
std::make_shared<int>(num) 和 std::shared_ptr<int> p1(new int(num));二者创建智能指针有什么区别
std::make_shared(num)和std::shared_ptr p1(new int(num))这两种方式都可以用于创建一个std::shared_ptr指向一个int类型的对象,并且都是在堆上分配内存是一次性分配了一个包含对象和引用计数的连续内存空间。则需要分别在堆上分配一个对象和一个引用计数,因此可能会存在一些额外的开销。因此该计数和对象的内存是一起被管理的,这样可能会在内存方面有一定的优化。而std::shared_ptr p1(new int(num))则需原创 2023-04-07 23:36:13 · 252 阅读 · 0 评论 -
结构体声明、定义和初始化的几种方式
直接声明结构体类型声明结构体类型的同时定义结构体变量不指定结构体名而直接定义结构体变量使用结构体标记和类型别名直接声明结构体别名有typedef 和无typedef 关键字的区别在于,第一种方式将结构体标记和类型别名定义在一起,可以更方便地使用别名来代替结构体类型;而第二种方式直接定义结构体类型,不需要定义结构体标记,但需要使用 struct 关键字来引用结构体类型如果结构体类型没有设置类型别名,则必须在定义变量时使用结构体标记来指定变量的类型,而不能使用类型别名。。原创 2023-04-07 15:41:37 · 1285 阅读 · 0 评论 -
C++ (&valName)[index] 方式访问数组
C++ (&valName)[index] 方式访问数组(&valName)[4] 是 C++ 中的数组访问方式之一,它表示访问一个由 bytes 数组的第四个元素开始的新数组。具体来说,这个表达式中的 &bytes 将 bytes 数组的地址作为一个指针返回,然后在这个指针上进行偏移量的计算。因为 bytes 数组的类型是 char,所以这个偏移量是以字节为单位计算的。(&bytes)[4] 就表示一个新的 char 类型的数组,它包含了从 bytes 数组的第四个元素(即 0x78)开始的所有元素原创 2023-03-25 17:10:47 · 456 阅读 · 0 评论 -
C++ std::ref() 函数使用详解
函数时,必须保证被转换的对象的生命周期要长于引用包装器的使用期限,否则会导致未定义的行为。另外,引用包装器的使用也可能会导致代码可读性降低,因此需要谨慎使用。的实例,它的主要作用是将一个对象转换成一个引用类型,并提供了访问该对象的引用的方法。是C++标准库中的一个函数,定义在。例如,下面的代码演示了如何使用。,以便在函数模板中使用。引用包装器是一个类模板。函数,以便在函数对象。最后,输出结果表明,原创 2023-04-05 01:22:51 · 3687 阅读 · 0 评论 -
C++中智能指针(unique_ptr、shared_ptr、weak_ptr)详解
C++中的智能指针是一种 RAII(资源获取即初始化)机制的实现,它可以在对象不再需要时自动释放相关资源。智能指针通过封装指针对象并提供一些额外的功能,如引用计数、自动内存管理、避免内存泄漏等C++中,有三种主要类型的智能指针:unique_ptr、shared_ptr和weak_ptr。智能指针是C++中管理动态内存的重要工具,它可以大大减少内存泄漏和悬挂指针等问题的发生。在使用智能指针时,原创 2023-04-06 23:51:29 · 868 阅读 · 0 评论 -
C++使用make_系列函数创建智能指针
C++使用make_系列函数创建智能指针make_系列函数可以用于创建智能指针,并且不需要手动管理内存。make_unique用于创建unique_ptr,make_shared用于创建shared_ptr。它们都使用了可变参数模板(variadic templates)和完美转发(perfect forwarding),可以方便地传递构造函数参数。需要注意的是,make_系列函数只能用于创建智能指针,而不能用于创建裸指针。make_unique和make_shared分别创建了一个unique_ptr和一原创 2023-04-07 00:06:29 · 428 阅读 · 0 评论 -
C++什么是结构体的声明、定义、初始化?
结构体的声明包括两个部分:结构体的名称和结构体的成员变量。声明结构体不会分配内存空间,仅仅是为结构体类型定义了一个名字,可以用于后续的定义和声明。结构体的定义用于分配内存空间,并为结构体的成员变量赋值。定义结构体可以使用以下两种方式结构体可以通过以下几种方式进行初始化:使用成员初始化器默认初始化列表初始化通过动态内存分配方式定义结构体指针直接定义结构体变量原创 2023-04-07 23:24:18 · 1305 阅读 · 0 评论