C/C++
zhjs_abc
不要在可以吃苦的时候而选择了安逸
展开
-
cmake设置使用clang来进行编译
【代码】cmake设置使用clang来进行编译。原创 2023-07-20 16:08:50 · 374 阅读 · 0 评论 -
cmake设置启用intel编译器编译c++代码
注意,不同版本的intel编译器套件,名称可能不一样,我这里用的是2022版的。原创 2023-07-20 15:54:02 · 430 阅读 · 0 评论 -
C++中一种控制帧率的简单算法
c++中一种帧率控制方法原创 2023-04-06 15:27:26 · 1274 阅读 · 1 评论 -
使用find_library,find_path如何设置只寻找静态库而不是动态库
cmake中find函数优先寻找静态库原创 2023-03-27 12:32:40 · 374 阅读 · 0 评论 -
交叉编译folly库
folly库交叉编译原创 2023-03-27 00:04:28 · 1247 阅读 · 0 评论 -
cmake中使用find_package以及find_path和find_library时候设置搜索路径
库依赖原创 2023-03-26 23:45:39 · 2641 阅读 · 2 评论 -
如何引用含有pkgconfig的第三方库
pkgconfig找库原创 2023-03-26 17:07:39 · 448 阅读 · 0 评论 -
如何将两个静态库打包合并到一个静态库中
将多个静态库打包到一个静态库中,解除多个依赖问题原创 2023-03-24 23:10:31 · 2079 阅读 · 0 评论 -
cmake中如何添加fPIC编译选项
cmake添加fPIC编译选项原创 2023-03-24 21:59:45 · 2748 阅读 · 0 评论 -
使用交叉编译链工具编译C++的cmake配置
设置c++交叉编译原创 2023-03-14 19:00:11 · 451 阅读 · 0 评论 -
ASAN使用和编译
ASAN编译和运行原创 2023-03-14 17:22:38 · 1156 阅读 · 0 评论 -
cmake学习笔记 二
cmake原创 2022-08-10 12:42:57 · 222 阅读 · 0 评论 -
C++虚继承理解
看原文:C++虚继承和虚基类详解原创 2020-10-12 15:42:49 · 114 阅读 · 0 评论 -
对C++多重继承中函数名称查找的理解
class A1 { public: virtual void P() const = 0; void print() const { std::cout << "A1\n"; }; }; class B1 : public A1 { public: void P() const override final { print(); } void print() const { std::cout << "B1\n"; } }; class B.原创 2020-10-07 20:30:01 · 245 阅读 · 0 评论 -
volatile变量与原子变量的差异
原子变量:能够保证其上的所有操作都是原子性的,不可分割的;使用默认的内存序模型的原子变量可以保证编译器或者硬件不会对相关代码或指令进行重排;volatile变量:不保证其上的所有操作都是原子性的;编译器可能会对相关代码进行重排,或者CPU硬件进行指令重排;告诉编译器不会优化那些冗余代码:int x;x = 20; // 使用volatile后,编译器不会把这一句优化掉x = 30;auto y = x; // 使用volatile后,编译器不会把这一句优化掉,但是如果是原子变量原创 2020-10-06 22:31:22 · 989 阅读 · 0 评论 -
C++学习笔记-lambda表达式
lambda表达式的值捕获或者引用捕获只能捕获lambda表达式的作用域内可见的非静态局部变量,包括形参;在构造lambda表达式的时候,尽量不要使用默认的值捕获或者默认的引用捕获,而是直接将需要捕获的变量放到捕获列表中;在类中使用lambda捕获成员变量时,无法通过将成员变量加入到捕获列表里面去捕获,可以通过默认的值捕获的方式捕获成员变量:class A{private: int m;public: void f() { auto r = [](){std::cout ..原创 2020-10-05 14:52:19 · 222 阅读 · 0 评论 -
C++11中用户自定义字面值类型
C++的字面量运算符重载literal operator;User-defined literals。原创 2020-10-05 14:03:24 · 293 阅读 · 0 评论 -
在线分析查看C++汇编结果或者预处理展开结果
在线分析C++汇编结果;在线分析C++预处理展开结果。原创 2020-10-04 23:32:47 · 1678 阅读 · 0 评论 -
C++学习笔记-右值引用、移动语义和完美转发
std::move()只是做了一次强制类型转换,将实参转成右值类型,并不做其他任何动作;如果想用std::move()实现真正的移动操作,那么传入的实参类型一定不能是常量类型,不然通过std::move()强转出来的类型也仍然带有常量属性,导致调用构造函数时调用的是复制构造函数,而不是移动构造函数;当定义的函数的形参是右值类型的时候,只能传入一个右值给这个函数,不能传一个左值给这个函数;std::move()是无条件的将实参转成右值类型(当然会保留常量属性),而std::forward..原创 2020-10-04 17:55:12 · 187 阅读 · 0 评论 -
C++学习笔记-智能指针
如果想用堆内存指针,则最好首选std::unique_ptr,它的大小与内置类型指针相同,且性能也几乎与内置类型指针差不多。如果内置类型指针对你来说足够小或者足够快,那么std::unique_ptr几乎可以肯定也能满足你的要求。不过,如果不使用默认的析构器,而是自定义析构器,则大小可能会变化。当自定义析构器是普通函数时,则大小至少加上函数指针的尺寸,如果自定义析构器是函数对象,则带来的尺寸变化取决于该函数对象中存储了多少状态。无状态的函数对象(如无捕获的lambda表达式)不会浪费任何存储空间。因此,..原创 2020-09-30 16:36:23 · 567 阅读 · 0 评论 -
C++学习笔记-现代C++功能
当函数的形参是按值传递时,实参的顶层const属性以及引用属性在传入时都会被忽略,但是实参的底层const不会被忽略。当形参是指针或者左值引用时(T&),实参的顶层const或底层const都不会被忽略,但是实参的引用属性仍然被忽略。当形参是万能引用时(T&&),实参的顶层const和底层const也不会被忽略,但是实参的引用属性被忽略,此外,尽管此时形参是右值引用,但是传入的实参是左值时,形参会变成左值引用,传入的实参是右值时,形参也会变成右值引用。此外,volatile如同c..原创 2020-09-29 14:33:51 · 172 阅读 · 0 评论 -
C++11,C++14,C++17以及C++20所有新特性总结
在github上有人总结了:C++新特性总结原创 2020-09-19 19:31:35 · 3736 阅读 · 0 评论 -
C++加快IO操作的方法
如果C++代模块中没有使用C的输入或输出函数,而是只用到了C++的输入输出函数,则可以使用std::ios::sync_with_stdio(false)来关闭同步。这个函数是一个“是否兼容stdio”的开关,C++为了兼容C,保证程序在使用了std::printf和std::cout的时候不发生混乱,将输出流绑到了一起。解绑后,速度会有质的提升;此外,std::cin与std::cout也有绑定,导致每次std::cout执行后并在执行sstd::cin时都会刷新输出缓冲区,解除同步能够进一步加快IO.原创 2020-09-16 19:35:58 · 1322 阅读 · 0 评论 -
C++如何快速进行IO操作
详情请移步:探寻C++最快的读取文件的方案;原创 2020-09-14 17:41:11 · 422 阅读 · 0 评论 -
关于三种内存序的一些注意点
RWM操作中含有两种操作,一个load操作,另一个store操作。然而,RWM操作的函数只支持传入一个内存序形参来同时表示store操作和load操作(那些CAS操作能够传入两个内存序形参并不是分别给load操作和store操作用的,是分别对应操作失败和操作成功的),因此,如果RWM函数中内存序传入的是acquire,consume内存序,则此内存序只能对RWM中的load部分有效,如果传入的是release,则只对RWM中的store有效,如果传入的是acq_rel或者seq_cst,则能同时对R...原创 2020-09-05 16:30:54 · 433 阅读 · 0 评论 -
高并发栈(stack)数据结构的无锁实现和超详细分析过程
一、创建无锁栈1. 实现无锁栈的基本结构众所周知,栈是一个后进先出(LIFO)的数据结构,栈只需要直接访问栈首元素即可,因此,可以使用最简单的单向链表来实现栈。向栈中加入元素的步骤为:创建一个新的节点;将新节点的next指针指向栈首(head元素);将head指向新节点;上述过程在单线程中很完美,但是在多线程中就有可能发生数据竞争:线程1将新节点1的next指向head之后,发生线程切换,线程2将自己的节点2的next指向head,并将head指向节点2。此时线程1切换回来继续执行,将新的h原创 2020-09-04 16:37:23 · 1352 阅读 · 2 评论 -
基于细粒度锁的高并发字典(查找表)的实现和分析过程
本文内容一、前言二、细粒度锁高并发查找表的实现1. 并发查找表的粗略实现2. 底层数据结构的高并发实现三、总结同博文基于细粒度锁的高并发队列的超详细实现和分析过程类似,也是对《C++ Concurrency In Action 2nd》中的例子的翻译及解析。本文相当于对前文的延续。废话不多说,直接开始。一、前言上一篇文章分析了队列的高并发实现过程,由于队列相对简单,所以相对来说比较容易实现。本文尝试使用细粒度锁来实现复杂的数据结构:查找表(即map)。设计查找表最复杂的莫过于对迭代器的并..原创 2020-08-25 16:46:21 · 275 阅读 · 0 评论 -
基于细粒度锁的高并发队列的超详细实现和分析过程
本文内容一、前言二、线程安全的队列的实现1. 使用锁和条件变量来实现线程安全的队列2. 使用细粒度锁和条件变量来实现线程安全的队列使用细粒度锁来实现队列的高并发性引入条件变量来实现队列的可等待接口三、总结一、前言最近在看《C++ Concurrency In Action 2nd》,发现里面一节基于锁来实现高并发的队列讲解的非常棒,并且里面体现了很多细节,而且还给出了一些实现高并发数据结构的指导方针,因此觉得很不错,就在此边翻译边讲解一下。本教程从比较粗糙的设计开始,一步一步转向更精细的设计,..原创 2020-08-22 18:11:44 · 661 阅读 · 1 评论 -
C++巨量知识点整理
请看以下链接:C++ 万字长文第一篇—拿下字节面试C++ 万字长文第二篇—拿下字节面试原创 2020-08-19 19:07:07 · 142 阅读 · 0 评论 -
C++11内存模型完全解读-从硬件层面和内存模型规则层面双重解读
acquire-release:release-sequence rule:指线程1中对原子变量进行store操作,线程2对此原子变量执行RMW操作,线程3对此原子变量页执行RMW操作,线程4与线程3类似…线程n对此原子变量执行load操作或者RMW操作。其中上述所有的store操作都是用的release、acq_rel、seq_cst语义,而所有的load作都用的acquire、acq_rel、seq_cst、consume语义,且除了最后一个线程中的RMW不能用relaxed语义外,其他任何中间线程原创 2020-08-18 16:43:11 · 4425 阅读 · 14 评论 -
C++中使用vector, array和内置数组的效率说明
前几天在VS下测试得出的结论:当数据量较小时,既可以使用vector(使用其push_back函数即可),也可以使用array或者内置数组,不过优先建议使用vector,其次是array,最后才是内置数组;当数据量较大时,由于array是在栈上分配空间,此时array不能用(因为栈空间有限,数据量太大就会栈溢出)(至少最新VS2019编译器是这样的),只能用vector或在堆上分配空间的内置数组。此时:优先使用vector,且尽量预先分配空间,而不是用push_back()来添加数据。 因为数据量..原创 2020-08-06 16:07:41 · 3756 阅读 · 0 评论 -
C++中函数静态重载与名称查找
函数的静态重载只针对在同一个作用域中具有相同名称的函数才有效,不同作用域中的函数不行。在函数调用处,编译器会将同一作用域中具有相同名称的函数都作为候选函数,一旦找到函数名称,就不再从其他作用域中查找函数名称了。找到名称后,编译器才进行类型检查,查看调用处的函数与上面声明处的是否有一致的函数。重要的是:名称查找优先于类型检查,举个例子:int f1() {return 1;}namespace{ int f1(int a) {return a + 1;} void f1() {} //...原创 2020-08-06 15:59:36 · 409 阅读 · 0 评论 -
C++11中的线程感知内存模型(thread-aware memory model)中内存序(memory order)的讲解以及底层原理剖析
好吧,并不是我来讲解,最近看了几篇博文,从硬件层面分析了内存序以及各种同步的必要性,感觉讲的非常好,因此这里做一个中转站,让给多的人看到。这几篇文章都是知乎上的:高并发编程–多处理器编程中的一致性问题(上);高并发编程–多处理器编程中的一致性问题(下);高并发编程–线程同步;C++ memory order与happen-before。此外,知乎上也有其他不少文章讨论相关问题,大家都可以去看看!...原创 2020-08-05 22:54:55 · 433 阅读 · 0 评论 -
C++11内存模型和原子类型的简述
本文并非原创,转载于知乎文章C++11 - atomic类型和内存模型,请支持原创!!!概述:本文是两本书的读书笔记,一本是《深入理解C++11 - C++11新特性解析与应用》(下文简称书1),另外一本是《C++ Concurrency In Action》(英文版)(下文简称书2)。作者在Windows平台下使用多线程技术进行工业自动化领域开发工作,深知多线程程序开发、测试和调试及调优,是件痛苦的事情——深夜调试/失眠、抓狂……2000年之后,依靠CPU频率提升加速软件运行速度的免费午餐结束了转载 2020-08-03 16:03:02 · 458 阅读 · 0 评论 -
为什么适配器stack中成员函数top()和pop()需要分离实现
在STL的stack实现中,如果想要从stack中获取一个数据并将其弹出,需要两个成员函数配合,使用top()函数来得到这个数据,使用pop()函数来弹出数据。问题是,为什么不能在pop()中删除并返回元素呢?在《C++ Concurrency In Action》书中有一段描述:假设有一个stack<vector<int>>,vector是一个动态容器,当你拷贝一个vector时,标准库会从堆上分配很多内存来完成这次拷贝。当这个系统处在重度负荷,或有严重的资源限制的情况下,这原创 2020-07-22 20:11:02 · 1616 阅读 · 0 评论