C++
文章平均质量分 61
C++技术汇总
荆楚闲人
老骥伏枥,志在千里;烈士中年,壮心不已。
展开
-
C++ virtual public(虚继承类)
由于C++支持多重继承,所以对于一个派生类中有几个直接父类,而几个直接父类中有几个可能分别继承自某一个基类(就是父类的父类),这样在构造最终派生类时,会出现最终派生类中含有多个同一个基类的情况,就会产生二义性的问题(不知道该调用哪个基类的成员变量和函数),为解决此问题,需要使用虚基类,即只对此基类生成一块内存区域,这样最终派生类中就只会含有一个基类了。如果将B、C类改为像如下那样从A类虚拟继承,则不会存在有二义性问题,编译器不会报错。其中D继承自BC,BC分别继承自A,所以A要分别被BC虚拟继承。原创 2024-06-16 10:35:28 · 379 阅读 · 0 评论 -
C++实现更改8位无符号整形的第n比特位值为1或0
仅仅通过更改需要更改的比特位的值来改变value的值,如:本例中将11110011的第6位(基于0的索引,下同)的值由1改为0,其它位的值保持不变,即改为10110011。这种场景在监控类的需求中很常见:在该类需求中,有时我们获取到了原来的数据帧(包),该数据帧(包)就1个字节即8位,每位表示1个状态,需求要用最新的值更改其中的某位,如何用代码实现?value为8位无符号整形,如何更改其第n比特位的值?原创 2024-04-07 18:45:56 · 418 阅读 · 0 评论 -
纯C++写的、Linux下 的CAN报文发送、接收类
【代码】纯C++写的、Linux下 的CAN报文发送、接收类。原创 2023-12-19 08:30:35 · 1518 阅读 · 3 评论 -
std::thread暂停、挂起及挂起后恢复执行的功能实现
其中threadFun为线程的执行函数,可以是一般函数、类的成员函数、lamba表达式等, threadParm1, threadParm2, .... threadParamN为线程参数。C++11提供了std::thread类,用于多线程编程。原创 2023-11-30 08:28:47 · 924 阅读 · 4 评论 -
利用C++11并发库实现的线程池(超级好用、超级强大)
【代码】一个完全利用C++11并发库实现的线程池。原创 2023-08-22 18:50:56 · 661 阅读 · 0 评论 -
std::result_of/std::invoke_result用法总结
在C++中,有时我们需要获取函数或可调用对象的返回值类型,以便进行后续的操作,在泛型编程中很常用,特别是当不同的参数集的结果类型不同时。在早期的C++版本中,我们需要手动推导函数返回值类型,这个过程非常复杂,也容易出错。为了解决这个问题,C++11引入了std::result_of、C++14引入了std::result_of_t(),这两个模板可以方便地获取函数或可调用对象的返回值类型。转载 2023-08-16 13:50:34 · 641 阅读 · 0 评论 -
__attribute__ ((constructor))和__attribute__ ((destructor))用法
可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)。__attribute__前后都有两个下划线,并且后面会紧跟一对原括弧,括弧里面是相应的__attribute__参数。__attribute__ ( ( attribute-list ) ) 函数定义如果函数被设定为constructor属性,则该函数会在main()函数执行之前被自动的执行;原创 2023-08-10 14:23:35 · 627 阅读 · 0 评论 -
C++中模板定义与声明为什么必须放在同一个文件中
通常情况下,你会在.h文件中声明函数和类,而将它们的定义放置在一个单独的.cpp文件中。但是在使用模板时,这种习惯性做法将变得不再有用,因为当实例化一个模板时,编译器必须看到模板确切的定义,而不仅仅是它的声明。因此,最好的办法就是将模板的声明和定义都放置在同一个.h文件中。这就是为什么所有的STL头文件都包含模板定义的原因。”[1]"标准要求编译器在实例化模板时必须在上下文中可以查看到其定义实体;转载 2023-08-08 14:00:55 · 1500 阅读 · 0 评论 -
C++泛型编程之模板
泛型编程//函数模板class Apublic:A(T a,T b):_a(a),_b(b){}private:T _a;T _b;int main()//类模板必须显示实例化a.print();注意:类模板中函数放在类外进行定义时,需要加模板参数列表//函数模板class Apublic:A(T a,T b):_a(a),_b(b){}private:T _a;T _b;注意:类模板中函数放在类外进行定义时,需要加模板参数列表。转载 2023-08-01 14:01:41 · 96 阅读 · 0 评论 -
c++类模板中静态成员变量的声明定义
难道要我们在每个使用该类模板的.cpp中,都手动增加一个定义吗?就在ca.h中,加上一条。但是在写类模板时,一般所有的代码都是放在.h文件中的,如果要做分离是一件很麻烦的事。那如果出现了静态成员怎么办?我们知道,c++中,类的静态成员是要在.cpp文件中定义的,如果在.h中定义,会出现重复定义。这样,就可以对所有的类型自动定义该静态变量啦。转载 2023-07-28 10:32:11 · 475 阅读 · 0 评论 -
C++中如何前置声明命名空间中的类
C++中如何前置声明命名空间中的类原创 2023-05-20 09:26:23 · 683 阅读 · 0 评论 -
C++/C宏定义中## 连接符与# 符的含义
C++/C宏定义中## 连接符与# 符的含义原创 2022-03-18 09:20:32 · 888 阅读 · 2 评论 -
【C++】智能指针详解
参考资料:《C++ Primer中文版 第五版》我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。动态内存管理经常会出现两种问题:一种是忘记释放内存转载 2022-01-23 19:03:46 · 1971 阅读 · 0 评论 -
字符串后缀sv和s的理解、用法
#include <iostream>using namespace std::literals;int main(int argc, char* argv[]){ std::string_view s1 = "abc\0\0def"; std::string_view s2 = "abc\0\0def"sv; std::string s3 = "abc\0\0def"; std::string s4 = "abc\0\0def"s; std::.原创 2022-01-23 18:47:52 · 2490 阅读 · 0 评论 -
string_View理解与用法(一)
什么是string_view当你创建一个将(常量)字符串作为参数的函数时,你有四个选择,你可能知道两个,但不知道另外两个:void TakesCharStar(const char* s); // C conventionvoid TakesString(const string& s); // Old Standard C++ conventionvoid TakesStringView(absl::string_view s);转载 2022-01-19 09:14:30 · 8633 阅读 · 0 评论 -
string_view理解与用法(二)
以前写了《string_View理解与用法(一)》和《详解C++17下的string_view》,请参考。本篇文章从string_view引入的背景出发,依次介绍了其相关的知识点及使用方式,然后对常见的使用陷阱进行了说明,最后对该类型做总结。一、背景在日常C/C++编程中,我们常进行数据的传递操作,比如,将数据传给函数。当数据占用的内存较大时,减少数据的拷贝可以有效提高程序的性能。在C中指针是完成这一目的的标准数据结构,而C++引入了安全性更高的引用类型。所以在C++中若传递的数据仅仅只读,co转载 2022-01-23 17:03:10 · 5349 阅读 · 1 评论 -
C++11中线程所有权转移分析
移动特性说明C++标准库中有很多资源占有(resource-owning)类型,比如std::ifstream,std::unique_ptr还有std::thread都是可移动,但不可拷贝。移动拷贝或者移动赋值都使得原有对象对所属资源的控制权发生转移,从对象A转移到对象B,对资源的控制只在对象B中保留。以下是std::thread线程类的移动特性的声明,支持移动构造和移动对象,但不可拷贝。//移动构造函数thread( thread&& other ) noexcept转载 2021-02-25 08:55:26 · 459 阅读 · 0 评论 -
C++11线程管理基础
1. 启动线程在C++ 11中线程是在std::thread对象创建时启动。因为我们把启动线程的重心放在如何构造这个thread对象,其构造函数有以下几个://仅仅是构造一个线程类,但没有和具体化的线程函数关联thread() noexcept;// 移动构造函数thread( thread&& other ) noexcept;//构造新的 std::thread 对象并将它与执行线程关联template< class Function, class... Arg原创 2021-02-24 09:02:32 · 369 阅读 · 0 评论 -
C++11多线程thread参数传递问题
//仅仅是构造一个线程类,但没有和具体化的线程函数关联thread() noexcept;// 移动构造函数thread( thread&& other ) noexcept;//构造新的 std::thread 对象并将它与执行线程关联template< class Function, class... Args >explicit thread( Function&& f, Args&&... args );上面就是C++.原创 2021-02-20 09:10:12 · 3547 阅读 · 2 评论 -
c++11 thread类的简单使用
一个thread对象就代表一个线程执行,当对象创建完成后,线程函数就开始执行,下面这段话是c++11的thread类介绍。An initialized thread objectrepresents an active thread of execution; Such a thread objectis joinable, and has a unique thread id.A default-constructed (non-initialized)thread object isno...原创 2021-02-20 08:36:52 · 725 阅读 · 0 评论 -
c++11中thread join和detach的区别
线程状态:在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的:1)就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行2)运行:占用CPU,正在运行中3)休眠:暂不参与调度,等待特定事件发生4)中止:已经运行完毕,等待回收线程资源线程环境:线程存在于进程之中,进程内所有全局资源对于内部每个线程都是可见的。进程内典型全局资源如下:1)代码区:这意味着当转载 2021-02-25 09:04:03 · 170 阅读 · 0 评论 -
c++11 yield函数的使用
yield函数时c++11的新特性,它在std::this_thread::yield命名空间中实现,函数声明如下:void yield() noexcept; 其作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行比如说你的线程需要等待某个操作完成,如果你直接用一个循环不断判断这个操作是否完成就会使得这个线程占满CPU时间,这会造成资源浪费。这时候你可以判断一次操作是否完成,如果没有完成就调用yield交出时间片,过一会儿再来判断是否完成,这样这个线程占用CPU时间会大大减少。,例如:转载 2021-02-26 08:42:24 · 1086 阅读 · 2 评论 -
C++11保护共享数据的其他方法
保护共享数据的初始化过程在多线程编程中,互斥量是最通用的保护共享数据的机制。但是在某些情况下,一些资源仅需要在第一次初始化的时候需要保护,其时候就可以不需要互斥变量的保护了。比如编码中最常见的单例模式,核心代码如下://(3)获得本类实例的唯一全局访问点static CSinglton* GetInstance(){ //若实例不存在,则创建实例对象 if (NULL == pInstance) { pInstance = new CSinglton()转载 2021-02-28 09:30:46 · 215 阅读 · 0 评论 -
C++11向线程函数传递参数
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );这个是std::thread构造函数之一,其中f是可调用对象,args是传递给f的参数。默认传递给f的是按值复制,若需要传递引用参数给线程函数,则必须包装它(例如用 std::ref 或 std::cref )。f类型:普通函数 类成员函数args分类:引用传.转载 2021-02-25 08:41:41 · 1021 阅读 · 0 评论 -
C++11多线程之future和promise
uture和promise的作用是在不同线程之间传递数据。使用指针也可以完成数据的传递,但是指针非常危险,因为互斥量不能阻止指针的访问;而且指针的方式传递的数据是固定的,如果更改数据类型,那么还需要更改有关的接口,比较麻烦;promise支持泛型的操作,更加方便编程处理。假设线程1需要线程2的数据,那么组合使用方式如下:线程1初始化一个promise对象和一个future对象,promise传递给线程2,相当于线程2对线程1的一个承诺;future相当于一个接受一个承诺,用来获取未来线程2传递的值转载 2021-03-02 07:30:50 · 1536 阅读 · 0 评论 -
c++11多线程之packaged_task<>介绍与实例
本节讨论c++11中std::packaged_task的特性与使用方法std::packaged_task<>std::packaged_task<>是一个类模板,代表一个异步任务。封装了1、可调用实体,即函数,lambda函数或函数对象2、一个共享状态,通过关联的回调来存储返回的值或抛出的异常。//从DB获取数据std::string gtDataFromDB(std::string token){ //Do some stuff to fetch the d转载 2021-03-02 09:05:24 · 2525 阅读 · 1 评论 -
C++11之std::async使用介绍
在C++11中有个async异步函数,其声明如下:template <class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async (launch policy, Fn&& fn, Args&&... args);该模板函数 async 异步地运行函数 fn 并返回最终将保存该函数调用结果的 std::future 中,其中polic转载 2021-03-02 09:21:36 · 1742 阅读 · 0 评论 -
C++11使用互斥量保护共享数据
C++中使用互斥量在C++11中,可以通过实例化std::mutex创建互斥量,可以通过调用成员函数lock()进行上锁,调用unlock()进行解锁。例如:int g_num = 0;std::mutex g_num_mutex;void slow_increment(int id){ for (int i = 0; i < 3; ++i) { //加锁 g_num_mutex.lock();转载 2021-03-02 09:26:49 · 588 阅读 · 0 评论 -
c++11仔细地将参数传递给线程std::thread
要将参数传递给线程的可关联对象或函数,只需将参数传递给std::thread构造函数。默认情况下,所有的参数都将复制到新线程的内部存储中。看一个例子:给线程传递单个参数#include <iostream>#include <string>#include <thread> void threadCallback(int x, std::string str) { std::cout << "Passed Number = " &.转载 2021-04-19 09:20:38 · 847 阅读 · 0 评论 -
std::bind绑定成员函数,为什么第二个参数必须绑定对象地址
td::bind这个函数在绑定成员函数的时候,必须显示指明实例化后的对象的地址。因为在此处bind的第一个参数是 类 的成员函数的地址,没有经过实例化,所以不是内存中真正的位置,需要配合实例化后的对象的地址才可以一起使用。struct Foo { void print_sum(int n1, int n2) { std::cout << n1+n2 << '\n'; } int data = 10;};int ma.原创 2021-02-28 09:35:57 · 1873 阅读 · 4 评论 -
std::async()详解
1、std::async函数原型:template<class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async(launch policy, Fn&& fn, Args&&...args);功能:第二个参数接收一个可调用对象(仿函数、lambda表达式、类成员函数、普通函数......)作为参数,并且异步或是同步执行他们。a、对于是异原创 2021-02-19 09:11:35 · 629 阅读 · 0 评论 -
C++11中的std::function
文章转载自:http://www.jellythink.com/archives/771看看这段代码先来看看下面这两行代码:std::function<void(EventKeyboard::KeyCode, Event*)> onKeyPressed;std::function<void(EventKeyboard::KeyCode, Event*)> onKeyReleased;这两行代码是从Cocos2d-x中摘出来的,重点是这两行代码的定义啊。std::f转载 2021-02-11 18:34:31 · 261 阅读 · 0 评论 -
C++ STL 四种智能指针
文章目录0.前言 1.unique_ptr 2.auto_ptr 3.shared_ptr 3.1 shared_ptr 简介 3.2 通过辅助类模拟实现 shared_ptr 4.weak_ptr 4.1 weak_ptr 简介 4.2 weak_ptr 用法 4.3 weak_ptr 的作用 5.如何选择智能指针 参考文献0.前言C++ 标准模板库 STL(Standard Template Library) 一共给我们提供了四种智能指针:au.转载 2021-02-11 14:49:26 · 1346 阅读 · 0 评论 -
STL 容器中的元素必须满足的条件
STL中的容器、迭代器、算法都是模板,因此可以操作任何型别。不论是STL预先定义好的或用户自行定义的都可以。然而,由于某些加诸于袁术身上的操作行为,某些需求条件也就相应出现了。STL容器元素必须满足以下三个基本条件:必须可通过拷贝复制构造函数进行复制。副本与原本必须相等,亦即所有相等测试的结果必须显示原本和副本行为一致。 所有容器都会在内部生成一个元素副本,并返回该暂时性副本,因此拷贝构造函数会被频繁地调用。所以拷贝构造函数的性能应该尽可能地优化,虽然这不是必须的条件之一,但可视为获得良好性能...原创 2020-10-03 09:00:23 · 568 阅读 · 0 评论 -
std::reserve和std::resize的区别
std::reserve是设置容器容量的,调用该函数后,容器的capacity可能会变大或不变,但不会变小如: vector value{ 2,3,5,7,11,13,17,19,23,29,31,37,41,43,47 }; int k = value.capacity(); value.reserve(2); int k1 = value.capacity();在我本机上例k、k1都为15,即和value.size()大小相等,k1并不是2,如果将.原创 2020-10-01 18:10:45 · 915 阅读 · 0 评论 -
C++11中的std::bind
文章转载自:http://www.jellythink.com/archives/773看看这段代码这几天学习Cocos2d-x,看到了以下的一段代码:// new callbacks based on C++11#define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__) #define CC_CALLBACK_1(__selector转载 2021-02-11 18:32:17 · 193 阅读 · 0 评论 -
C++17下map不常用的接口函数汇总
C++17下的map提供了如下接口:emplace(Args&&...args),原位构造元素,将参数args...转发给构造函数并插入生成元素 emplace_hint(const_iterator hint, Args&&...args)原位构造元素,插入新元素到容器中尽可能接近于恰在hint前的位置 try_emplace(const key_type& k, Args&&... args) try_emplace(...原创 2021-03-04 09:11:57 · 457 阅读 · 1 评论 -
make_shared和shared_ptr的区别
struct A;std::shared_ptr<A> p1 = std::make_shared<A>();std::shared_ptr<A> p2(new A);上面两者有什么区别呢? 区别是:std::shared_ptr构造函数会执行两次内存申请,而std::make_shared则执行一次。std::shared_ptr在实现的时候使用的refcount技术,因此内部会有一个计数器(控制块,用来管理数据)和一个指针,指向数据。因此在执行std::.原创 2021-03-30 08:37:53 · 4260 阅读 · 0 评论 -
std::is_same用法
std::is_same原创 2021-04-28 09:31:16 · 366 阅读 · 0 评论 -
C++ chrono 库中的 steady_clock 、 system_clock、high_resolution_clock区别
C++11 中提供了一个计时的标准库<chrono>;里面有三种时钟 clock: steady_clock, system_clock 和 high_resolution_clock;区别steady_clock 是单调的时钟,相当于教练手中的秒表;只会增长,适合用于记录程序耗时; system_clock 是系统的时钟;因为系统的时钟可以修改;甚至可以网络对时; 所以用系统时间计算时间差可能不准。 high_resolution_clock 是当前系统能够提供的最高精度..转载 2021-05-18 08:31:32 · 2789 阅读 · 0 评论