
c
文章平均质量分 80
致守
这个作者很懒,什么都没留下…
展开
-
C++ extern
file02.cpp使用的是file01.cpp中定义好的cats 和dogs,在file01.cpp可以不使用extern关键字,但是在file02.cpp中不使用extern关键字则这些 外部声明会变成定义。而且还会违反单定义规则。如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义(ORD),但在使用改变量的其他所有文件中,都必须使用extern声明这个变量。(referencing declaration)简称为声明,它不给变量分配空间,因为它引用已有变量。在全局变量中,引用声明使用。转载 2025-02-19 12:58:16 · 16 阅读 · 0 评论 -
C++模板(template)详解教程(很多代码示例)
函数模板背景:比如我们需要来比较不同数据类型的两个值,并指出第一个值与第二个值的大小关系,如果此时只定义只比较一种参数类型的函数,略显麻烦。此时引出了函数模板此时就不用为每个类型定义一个新的函数了。比如:return 0;模版定义:以关键字template开始,后跟一个模板参数列表,这是一个逗号分隔的一个或多个模板参数的列表,用小于号(<)和大于号(>)包围起来。实例化private:T1 first;T2 second;转载 2025-02-19 09:02:01 · 295 阅读 · 0 评论 -
突破编程_C++_C++11新特性(完美转发 forward)
std::forward 是 C++11 中引入的一个模板函数,主要用于在模板函数或模板类中实现参数的完美转发(perfect forwarding)。完美转发是指函数或类模板可以将其参数原封不动地转发给另一个函数或类模板,同时保持被转发参数的左右值特性(lvalue 或 rvalue)。这里,T 是一个模板参数,它代表了需要被转发的参数的原始类型。std::remove_reference<T>::type 是一个类型特性,用于从 T 中移除引用,从而得到原始类型。转载 2025-02-19 08:58:41 · 63 阅读 · 0 评论 -
又学懂辣 !五分钟带你掌握C++中的左值,右值,左值引用,右值引用 以及++i和i++的深度刨析 史上最详细!
1.i++返回的是临时值(右值),涉及创建和管理临时变量。2.++i返回的是变量i本身(左值),直接操作和返回变量,没有额外的临时变量开销。3.在实际使用中,++i通常比i++更高效,所以能用++i就尽量不用i++。总结1.左值是具有持久性且可以获取地址的对象或表达式,通常出现在赋值操作符的左边,例如变量或具名对象。2右值是临时性的、无法获取地址的对象或表达式,通常出现在赋值操作符的右边,例如临时计算的结果或字面量。3.左值引用使用声明,用于操作现有对象而避免复制,如传递参数和返回内部对象引用。转载 2025-02-19 08:55:59 · 45 阅读 · 0 评论 -
【C语言深入】细聊C语言中的“左值”和“右值”
这里需要注意的是任何变量在进行计算的时候,用的都是它的右值,所以表达时所产生的结果都是一个常量(也可以说是一个副本),所以对于指针的自加或自减(前置和后置都一样),其实分析方式都和上图一样,所以都是合法的右值,而不是一个合法的左值。对指针解引用时,它产生的结果也是既可以作为左值也可以作为右值,作为左值是它表示的是指针中存储的地址的那块空间,作为右值时它表示的是指针中存储的地址的那块空间中的内容。而且如今的编译器都是动态的分配内存空间的,也就是说程序这次执行和下一次执行时,同一个变量的地址是不同的。转载 2025-02-19 08:54:33 · 90 阅读 · 0 评论 -
C++ 新特性 | C++ 11 | std::forward、万能引用与完美转发
传统上,当一个左值传递给一个函数时,参数会以左值引用的方式进行传递;,当它作为参数时,有可能被一个左值/左值引用或右值/右值引用的参数初始化,这需要通过类型推导,推导后得到的参数类型会发生类型变化,这种变化就称为引用折叠。建议仅用于模板函数,对于非模板的,因为不涉及到类型推导,所以使用完美转发是没有意义的。引用折叠是一种特性,允许在模板元编程中使用引用类型的参数来创建新的引用类型。的类型来说,其既可以绑定左值,又可以绑定右值,而这个的前提是。返回左值引用,相应的,当接收一个右值作为参数时,转载 2025-02-17 19:57:24 · 72 阅读 · 0 评论 -
突破编程_C++_C++11新特性(完美转发 forward)
std::forward 是 C++11 中引入的一个模板函数,主要用于在模板函数或模板类中实现参数的完美转发(perfect forwarding)。完美转发是指函数或类模板可以将其参数原封不动地转发给另一个函数或类模板,同时保持被转发参数的左右值特性(lvalue 或 rvalue)。这里,T 是一个模板参数,它代表了需要被转发的参数的原始类型。std::remove_reference<T>::type 是一个类型特性,用于从 T 中移除引用,从而得到原始类型。转载 2025-02-17 19:42:22 · 16 阅读 · 0 评论 -
C++11的模板类型判断——std::is_same和std::decay
在模板里可以通过std::is_same判断模板的类型,从而实现对不同类型的区别对待在堆类型要求不是非常严格的情况下,可以使用std::decay把类型退化为基本形态,结合std::is_same用,可以判断出更多的情况C++11的模板类型判断——std::is_same和std::decay_c++ 判断模板类型-优快云博客。转载 2025-02-17 19:34:49 · 51 阅读 · 0 评论 -
C++中构造函数的分类和三种调用方法(附C++代码)
已经就是C++中构造函数的分类和三种调用方法,希望能帮到你!本人参考学习的是黑马程序员,仅作为笔记记录。C++中构造函数的分类和三种调用方法(附C++代码)_c++ 调用构造函数-优快云博客。转载 2025-02-17 18:51:16 · 117 阅读 · 0 评论 -
编译器对于C++构造函数的优化和C++17之后对构造函数的优化
发现竟然又只输出了一条,但是我们明明加了-fno-elide-constructors,我认为老师所说的优化应该指的就是这个吧,不管加不加-fno-elide-constructors,编译器都会进行优化。李伟老师在课程中提到最好不要对移动构造函数引入delete限定符,是因为C++17有一个优化,这句话听课的时候不太明白,先不加限定符在C++17下跑一下试试。手册上的解释是这样的。可以看出来,编译出现了错误,这就很迷了,之前明明分析的是编译器会默认对其构造函数引入优化,不应该没使用移动构造函数吗?转载 2025-02-17 15:38:29 · 23 阅读 · 0 评论 -
c++中返回值优化(RVO)和命名返回值优化(NRVO)介绍
半年前就想写一篇关于RVO和NRVO的介绍,但碍于没什么时间去写博客。在跟身边人进行学术探讨的时候,会发现部分人可能尝到了编译器给它做返回值优化的好处,知道这段代码被优化了,但为什么 如何去做,却不知道。因此,为了尝试说明RVO和NRVO的好处、使用场景、局限性等,在看了数个StackOverflow的讨论之后,有了这篇博客。转载 2025-02-17 15:36:47 · 51 阅读 · 0 评论 -
C++移动构造函数,移动赋值和编译选项-fno-elide-constructors
说明:使用C++98标准编译时,需要注释掉。选项,编译器会进行良好的优化。转载 2025-02-17 15:34:46 · 18 阅读 · 0 评论 -
shared_ptr 是线程安全的吗?
具体来说,shared_ptr<Foo> 包含两个成员,一个是指向 Foo 的指针 ptr,另一个是 ref_count 指针(其类型不一定是原始指针,有可能是 class 类型,但不影响这里的讨论),指向堆上的 ref_count 对象。此后 sp2 仍然能安全地管理 Foo 对象的生命期,并安全完整地释放 Foo,不会出现 delete void* 的情况,因为 delete 的是 ref_count.ptr,不是 sp2.ptr。(即 read g),以下完成了步骤 1,还没来及执行步骤 2。转载 2025-02-10 23:10:12 · 101 阅读 · 0 评论 -
使用 ltrace 进行 Linux 库函数调用跟踪分析
ltrace是一个强大的工具,尤其在需要调试或分析程序与共享库之间的交互时非常有用。它不仅能展示库函数的调用顺序,还能提供有关参数和返回值的详细信息,帮助开发人员更好地理解和优化程序。使用 ltrace 进行 Linux 库函数调用跟踪分析_迎难学字的技术博客_51CTO博客。转载 2025-02-09 22:21:01 · 45 阅读 · 0 评论 -
杂谈:Linux时间管理之gettimeofday实现
总结:这篇文件有点长,但是实际上这篇文章只是想说clock_gettime支持vdso,而vdso是通过内存映射的方式把内核态的数据直接映射到用户态,但是看似简单的过程,要想没有跳跃的弄清楚还真的需要些功夫,比如glibc的结构组织,vdso,内核时间更新等等,很是复杂,而这篇文章还没有涉及内核维护时间的内容,见下篇文章吧。最终我们看到无论哪种情况下调用的是__clock_gettime64函数,如果想知道如何在glibc中找到这个函数的可以参考这个文章,写的很清楚(在__TIMESIZE!转载 2025-02-09 22:19:30 · 52 阅读 · 0 评论 -
Linux时间子系统1:gettimeofday和clock_gettime实现分析
显然,sys_gettimeofday和sys_settimeofday这两个系统调用是用来支持上面两个函数功能的,值得一提的是:这些系统调用在新的POSIX标准中 gettimeofday和settimeofday接口函数被标注为obsolescent,取而代之的是clock_gettime和clock_settime接口函数。但是以上ID并没有包含全部的clock类型,时钟类型,以及时间与时钟源的关系,我们后面再来分析。这里的时间的含义是什么,我们获取到的是什么时间,这个问题下面再讨论。转载 2025-02-09 22:17:06 · 100 阅读 · 0 评论 -
深入理解linux下的短延迟:nanosleep,sleep
最近在使用nanosleep的时候又踩坑了。于是整理下linux短延迟的用法。转载 2025-02-09 21:20:27 · 121 阅读 · 0 评论 -
gettimeofday和clock_gettime是不是系统调用?
vdso机制说白了就是在用户空间帮我们实现了一些特定的系统调用,用户进程启动时这些代码会被自动映射到进程地址空间的用户空间中。这样的话,当我们利用vdso调用到这些系统调用时,就不会陷入内核了。直接调用这些系统调用对应的glibc包装函数就可以,因为这些glibc包装函数默认会使用vdso。实际上都是系统调用,但是调用得当的话,可以避免陷入内核,从而提高性能。dynamic shared object)机制帮我们做到了在调用这些系统调用时不陷入内核,从而提高了性能。,而这个函数是会陷入内核的。转载 2025-02-09 21:17:28 · 40 阅读 · 0 评论 -
LevelDB 源码阅读:利用 Clang 的静态线程安全分析
LevelDB 中有一些宏比较有意思,平时自己写代码的时候,还基本没用过。这些宏在中定义,可以在编译时。Clang 编译器的线程安全分析工具比如下面这些宏,到底有什么作用呢?本文就一起来看看吧。1234GUARDED_BY(x) // 表示变量必须在持有锁x时才能访问PT_GUARDED_BY(x) // 指针类型的 GUARDED_BYACQUIRED_AFTER(...) // 指定锁的获取顺序,防止死锁// ...转载 2025-02-07 14:34:54 · 17 阅读 · 0 评论 -
Clang的线程安全分析静态工具
Clang线程安全分析工具是C++语言的一种扩展,用于警告代码中潜在的竞争条件。它在编译期间进行静态分析,无运行期性能损耗。即使该工具仍处在开发阶段,但已足够成熟,适合部署在生产环境上。它的工作原理类似于一个针对多线程编程的类型系统。例如,变量foo可被多线程访问,当分析工具检测到该变量在读写时没有被对应的锁所保护时,会提示一个警告。转载 2025-02-07 14:33:23 · 26 阅读 · 0 评论 -
【Cmake MODULE模块库】深度理解CMake中的add_library_ MODULE的全面指南
在我们开始深入讨论add_library命令之前,让我们首先了解一下CMake和构建系统的基础知识。CMake(跨平台的Make)是一个开源的、跨平台的构建系统,它以简洁的语法和强大的功能获得了广泛的应用。它可以跟踪依赖关系、生成构建脚本,并跨多个平台和编译系统工作。这使得CMake成为了处理复杂项目和大型代码库的理想选择。构建系统(Build Systems)是软件开发中的一个重要部分,它们可以自动处理编译和链接过程中的各种任务。转载 2025-02-05 17:56:26 · 77 阅读 · 0 评论 -
深入解析 C++11 的 `std::atomic`:误区、性能与实际应用
并非所有操作都具备原子性,需谨慎选择操作方式。是否无锁依赖于数据类型、硬件架构和内存对齐。虽然提供线程安全,但也会带来一定性能开销。通过正确使用提供的原子方法,可以在多线程编程中实现更高效、更可靠的代码。深入解析 C++11 的 `std::atomic`:误区、性能与实际应用 - Further_Step - 博客园。转载 2025-02-05 11:15:09 · 97 阅读 · 0 评论 -
【多线程 六】彻彻底底搞懂CAS,解决ABA问题
小牛取款,由于机器不太好使,多点了几次取款操作。一个线程1从内存中取出A,这个时候另一个线程2也从内存中取出A,并且线程2进行了一些操作将值变成了B,线程1此时还被阻塞,线程2又进行了一些操作,然后将B又变成了A,此时线程1获得资源,开始执行,但是在进行cas操作的时候发现内存中还是A,然后线程1执行成功。综上也体现出了它的缺点,就是如果线程过多,其他的线程可能会一直改内存中的实际值,那么期望值var5就会很难和内存中的实际值相等,这样就会导致一直循环,效率下降,所以如果线程多,并发大,用锁比较合适。转载 2025-02-04 16:04:06 · 33 阅读 · 0 评论 -
面试|详解CAS及其引发的三个问题
在多线程编程的时候,为了保证多个线程对一个对象可以安全进行访问时,我们需要加同步锁synchronized,保证对象的在使用时的正确性,synchronized就是一种独占锁,它会导致所有需要此锁的线程挂起,等待锁的释放。转载 2025-02-04 15:55:20 · 16 阅读 · 0 评论 -
基础篇:详解锁原理,synchronized、volatile+cas底层实现
AQS其实就是基于volatile+cas实现的锁模板;如果需要线程阻塞等待,唤醒机制,则使用LockSupport挂起、唤醒线程//线程节点..........//head 等待队列头尾节点// The synchronization state. 同步状态...//提供CAS操作,状态具体的修改由子类实现AQS内部维护一个同步队列,元素就是包装了线程的Node同步队列中首节点是获取到锁的节点,它在释放锁的时会唤醒后继节点,后继节点获取到锁的时候,会把自己设为首节点。转载 2025-02-04 15:52:35 · 52 阅读 · 0 评论 -
CAS——比加锁更高效的多线程并发场景下数据一致性解决方案
compare and swap的缩写,中文翻译成比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数–内存位置、预期原值及更新值。执行CAS操作的时候,将内存位置的值与预期原值比较:如果相匹配,那么处理器会自动将该位置值更新为新值如果不匹配,处理器不做任何操作,多个线程同时执行CAS操作只有一个会成功。转载 2025-02-04 15:50:50 · 55 阅读 · 0 评论 -
线程安全之CAS机制详解(分析详细,通俗易懂)
接下来线程1先一步执行成功,把当前值成功从A更新为B,同时线程2因为某种原因被阻塞,没有做更新操作,线程3在线程1更新成功之后获取了当前值B,再之后线程2仍然阻塞,线程3继续执行,成功将当前值更新为A,最后,线程2终于恢复了运行状态,由于线程2之前获取了“当前值A”并且经过了Compare检测,内存地址中的实际值也是A,所以线程2最后把变量A更新成了B,在这个过程中,线程2获取的当前值是一个旧值,尽管和当前值一模一样,但是内存地址中V中的变量已经经历了A->B->A的改变。转载 2025-02-04 15:47:35 · 69 阅读 · 0 评论 -
聊聊并发(六)——CAS算法
代码示例:演示ABA问题1 // 原子引用类演示ABA问题56 // 线程 t1 由A修改B,又由B修改A111214 // 让t1线程完成ABA操作21232527 }28 }2930 // 结果34 C如何理解ABA问题?可能你会觉得,线程 t2 不就是要将"A"改为"C"嘛,虽然中间变化了,但对 t2 也没影响呀!转载 2025-02-04 15:42:38 · 96 阅读 · 0 评论 -
深入理解无锁编程:CAS 的原理、实现与应用实战
CAS 是现代并发编程中的核心技术之一,既是无锁编程的重要工具,也是高性能计算的基石。随着多核处理器的普及,硬件性能的提升以及高并发场景需求的增加,无锁编程逐渐成为并发编程的重要方向。在无锁编程的领域中,CAS(Compare-And-Swap)是一种高效、非阻塞的原子操作,广泛用于解决多线程编程中的数据一致性问题。尽管不是真正的无锁算法,自旋锁仍然是基于 CAS 实现的一个经典案例。在实践中,合理选择无锁算法并结合硬件和编程语言提供的工具,可以更高效地解决多线程并发问题,同时提高程序的健壮性和性能。转载 2025-02-04 15:39:38 · 59 阅读 · 0 评论 -
【并发基础】CAS(Compare And Swap)操作的底层原理以及应用详解
它就是CPU的一条原子指令。所谓缓存锁定 是指内存区域如果被缓存在处理器的缓存行中,并且在Lock 操作期间被锁定,那么当它执行操作写回到内存时,处理器不在总线上输出 LOCK# 信号,而是修改内部的内存地址,并允许它的缓存一致性机制来保证操作的原子性,因为缓存一致性机制会阻止同时修改两个以上处理器缓存的内存区域数据(这里和 volatile 的可见性原理相同),当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效。失败的线程不会挂起,仅是被告知失败,并且允许再次尝试,当然也允许实现的线程放弃操作。转载 2025-02-04 15:34:44 · 52 阅读 · 0 评论 -
C/C++原子操作与atomic CAS底层实现原理
计算机执行的最小单位就是指令,即CPU一次只能执行一条指令。假定有两个操作A 和B,如果从执行A 的线程来看,当另一个线程执行B 时,要么将B 全部执行完,要么完全不执行B,那么A 和B 对彼此来说是原子的。理想很丰满,现实很骨感.一句c语言"i++"的操作,经过编译翻译成汇编语言后成了三句汇编代码//c语言 ==> i++//汇编语言 ==> intel风格汇编__asm__{mov eax [i] //将变量i的值取出到cpu寄存器eax中inc eax //eax自增1。转载 2025-02-04 15:27:09 · 67 阅读 · 0 评论 -
小白都能看懂的CAS基本原理与实战应用指南
CAS(Compare And Swap)是一种用于实现无锁并发算法的技术。无锁优化、自旋、乐观锁它的核心思想是:通过比较当前需要修改的值与预期原来的值,如果相等,则使用新值进行替换。这个过程是原子性的,它底层是靠C语言依赖的操作系统的原子操作来保证原子性的,即在这个过程中不会被其他线程打断。在Java中,CAS操作主要是通过包中的原子类来实现的,如AtomicLong等。了不起带着大家从原理介绍、源码分析、实战应用等方面讲解了CAS的相关知识。转载 2025-02-04 15:22:18 · 114 阅读 · 0 评论 -
锁机制及CAS实现原理(C++)
上述我们设计了支持并发访问的数据结构。可以看到,设计可以基于。转载 2025-02-04 15:18:05 · 20 阅读 · 0 评论 -
深入理解无锁编程:CAS 的原理、实现与应用实战
无锁编程(Lock-Free Programming)是一种高效的多线程编程范式,旨在避免使用传统的锁机制(如互斥锁)来协调线程间的并发操作。它通过硬件提供的原子操作实现线程间的同步,从而避免了锁带来的性能瓶颈和死锁风险。在无锁编程中,线程之间不会因为竞争锁而发生阻塞,而是通过非阻塞的方式实现资源共享和安全访问。这种方式特别适用于高并发场景,可以显著提高程序的性能和可扩展性。无锁算法(Lock-Free Algorithm)是无锁编程的核心技术之一。它是指一种算法,在任何时刻至少有一个线程可以在有限步操作后转载 2025-02-04 15:15:24 · 58 阅读 · 0 评论 -
linux进程---exec族函数(execl, execlp, execle, execv, execvp, execvpe)
linux函数查询在调用进程内部执行一个可执行文件。可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。exec函数族分别是:execl, execlp, execle, execv, execvp, execvpeexec函数族的函数执行成功后不会返回,调用失败时,会设置errno并返回-1,然后从原程序的调用点接着往下执行。path:可执行文件的路径名字。转载 2025-01-16 23:15:45 · 37 阅读 · 0 评论 -
求二进制最低位1和最高位1的方法,以及反转二进制,复杂度O(1)
本文主要对三个二进制操作算法进行介绍,它们都是O(1)的。相对于暴力去计算,效率会高很多。这三个算法分别是 获取最低的1的比特位、获取最高1的比特位,反转二进制。转载 2025-01-14 19:54:43 · 164 阅读 · 0 评论 -
让事件飞 ——Linux eventfd 原理与实践
目前越来越多的应用程序采用。转载 2025-01-05 20:55:08 · 103 阅读 · 0 评论 -
Linux定时函数timerfd的使用问题以及解决办法
本文讲述使用epoll+timerfd+eventfd的组合来解决一个程序退出问题,如果有不对的地方,欢迎指正!Linux定时函数timerfd的使用问题以及解决办法-优快云博客。转载 2025-01-05 20:29:09 · 82 阅读 · 0 评论 -
timerfd简介
timerfd的由来比较简单,我们以往在使用定时器时,需要设定超时时间和超时后的回调函数,在定时器时间到来时,我们所注册的回调函数将会被执行。但是这种定时器很难被epoll等 I/O 多路复用机制接管。于是 Linux 下的timefd应运而生,使用timerfd创建出的定时器是基于文件描述符进行管理的,在达到超时时间时,描述符将置为可读,并可以从中读取到超时次数(启动定时器后或上次read之后的超时次数)。Linux 提供如下三个系统调用去使用timerfd。转载 2025-01-05 19:32:14 · 57 阅读 · 0 评论 -
Clang的线程安全分析静态工具
本文内容来自,如需完整学习,请参考相关链接。Clang线程安全分析工具是C++语言的一种扩展,用于警告代码中潜在的竞争条件。它在编译期间进行静态分析,无运行期性能损耗。即使该工具仍处在开发阶段,但已足够成熟,适合部署在生产环境上。它的工作原理类似于一个针对多线程编程的类型系统。例如,变量foo可被多线程访问,当分析工具检测到该变量在读写时没有被对应的锁所保护时,会提示一个警告。转载 2024-12-31 17:01:09 · 51 阅读 · 0 评论