
c++精华学习笔记
文章平均质量分 70
C++ 是一种功能强大且灵活的编程语言,广泛应用于系统编程、游戏开发、实时仿真等领域。为了帮助学习者更好地掌握这门语言,C++ 精华学习笔记汇集了关键概念、实用技巧和最佳实践。在这本笔记中,你将找到以下内容:
基础语法:包括变量、数据类型、控制结构等基本概念。
面向对象编程:深入探讨类与对象、继承
aFakeProgramer
Adaptive AUTOSAR的技术专家,2024 AUTOSAR中国官方TOP培训讲师,具备深厚的汽车行业知识和以太网通信技能。SOME/IP、IPC、DDS、DoIP、UDS、TSN和SOA架构,MQTT,加密,操作系统,v2x,以及c++和Python编程语言。
展开
-
std::hardware_destructive_interference_size
**C++14中的定义**:这一标准只提供了初步的定义,实际的值依赖于具体的编译器和平台。- **C++17中的定义**:此标准对定义进行了强化,增加了对具体硬件的信息,通常这些实现会更具体并具备更高的确切性。如何获取这些值你可以在 C++ 代码中使用以下方式检查这些常量的值:`cppreturn 0;具体值的例子- 在某些实现中,值可能是 64 字节(例如,某些Intel和AMD平台)。原创 2025-01-13 11:44:28 · 177 阅读 · 0 评论 -
c++如何使用volatile关键字保证线程安全?explicit和volatile的不同作用
volatilevolatileC++中的volatile关键字是一种类型修饰符,用它声明的变量表示可以被某些编译器未知的因素更改,比如操作系统、硬件或者其他线程等¹。volatile关键字可以保证变量的可见性,即当一个线程修改了volatile变量的值,其他线程可以立即看到最新的值。因此,如果要使用volatile关键字保证线程安全,需要满足以下两个条件:对volatile变量的操作是单个指令,不会被分解为多个指令。原创 2024-01-30 11:23:40 · 1288 阅读 · 0 评论 -
一些关于线程的可重入和不可重入的知识
线程安全:简单来说线程安全就是多个线程并发同一段代码时,不会出现不同的结果,我们就可以说该线程是安全的;线程不安全:说完了线程安全,线程不安全的问题就很好解释,如果多线程并发执行时会产生不同的结果,则该线程就是不安全的。线程安全产生的原因:大多是因为对全局变量和静态变量的操作。原创 2023-09-01 18:01:03 · 818 阅读 · 0 评论 -
strtok 函数是C标准库中的一个函数
strtok函数是C标准库中的一个函数,用于将字符串拆分成一系列子字符串(标记)。该函数声明在头文件中。下面是strtokstrtok。原创 2024-10-25 10:14:45 · 89 阅读 · 0 评论 -
C++17 `std::hardware_destructive_interference_size` 和 `std::hardware_constructive_interference_size`
例如,如果你有两个对象,它们在相似的时间局部访问模式下,你可以使用 `std::hardware_constructive_interference_size` 作为它们的内存占用大小和基本对齐的限制,以促进真共享。- 例如,如果你有两个对象,它们在不同线程中具有不同的访问模式,你可以使用 `std::hardware_destructive_interference_size` 作为它们之间的偏移量,以避免伪共享。- 这个值是一个**提示**,用于提高性能,但不一定等于实际的 L1 缓存行大小。原创 2024-05-24 17:51:27 · 989 阅读 · 0 评论 -
C++中的可变参数(Variadic arguments)
1. printf风格的函数:可变参数常用于类似`printf`的函数,用于生成格式化的字符串。:如果所有可变参数共享相同的类型,`std::initializer_list`提供了一种方便的机制来访问可变参数。3. 错误处理函数:类似于日志记录器,你可以编写自定义的错误处理函数,以便在不同情况下接受不同数量的参数。2. 自定义日志记录器:如果你需要编写自己的日志记录器,可变参数可以帮助你处理不同类型和数量的日志信息。总之,可变参数允许函数处理不定数量的参数,适用于多种场景。原创 2024-04-09 14:53:34 · 602 阅读 · 0 评论 -
Effective C++
明智而审慎地使用 private 继承(private 继承意味着 is-implemented-in-terms-of(根据某物实现出),尽可能使用复合,当 derived class 需要访问 protected base class 的成员,或需要重新定义继承而来的时候 virtual 函数,或需要 empty base 最优化时,才使用 private 继承)通过复合塑模 has-a(有一个)或 “根据某物实现出”(在应用域(application domain),复合意味 has-a(有一个);原创 2024-03-25 15:07:07 · 544 阅读 · 0 评论 -
C++代码性能优化的好处与缺点?有哪些编译器优化选项?
(5) 【技术】Linux中编译C++代码的g++工具,以及g++的常用操作指令-腾讯云开发者社区-腾讯云. https://cloud.tencent.com/developer/article/1936144.在C++编译过程中,`g++`的`-O1`和`-O2`选项是用来控制编译器优化的级别。(6) gcc/g++ -O 优化选项说明 - 不止所见 - 博客园. https://www.cnblogs.com/klcf0220/p/11244203.html.不同的编译器可能支持不同的优化选项集合。原创 2024-03-14 17:00:28 · 1180 阅读 · 0 评论 -
黑板战争 - 安全柜和智能锁
【代码】黑板战争 - 安全柜和智能锁。翻译 2024-03-05 09:23:27 · 110 阅读 · 0 评论 -
在 GitHub 上下载了一个 C++ 工程,并且该工程包含了 CMakeLists.txt 文件,该如何编译这个工程呢?
是你工程中生成的可执行文件的名称。根据你的工程,你需要替换它为实际的可执行文件名。如果你在 GitHub 上下载了一个 C++ 工程,并且该工程包含了。请注意,上述步骤中的。原创 2024-02-28 13:51:31 · 1513 阅读 · 0 评论 -
c++ 基于范围的for循环详解
(Range-based for loop),用于遍历容器和数组。如果确认不会修改引用对象,请在前面加上const限定符。帮助编译器生成更加高效的代码。在for循环中基于复杂对象我们使用引用,这样可以避免对象拷贝,提升性能。下面的示例展示了如何使用基于范围的for循环遍历之前定义的。C++11引入了一种更简洁、统一的循环结构——如果是基础类型,直接使用值即可。程序执行结果为:C++11!程序执行结果为:C++11。原创 2024-02-28 11:31:56 · 2641 阅读 · 0 评论 -
常见面试题——说说堆内存与栈内存的区别
在C++中,(heap)和(stack)是两种不同的内存分配方式,它们在存储数据、生命周期和访问方式上有很大的区别。new。原创 2024-02-28 11:11:52 · 502 阅读 · 0 评论 -
输出一段代码的运行时间间隔(C++ 11中的std::chrono库)
当我们需要测量代码执行的时间间隔时,我们可以使用C++ 11中的。,因为它创建了一个大小为n的向量来存储随机整数。,因为它测量了sort()函数的执行时间。,sort()函数的时间复杂度为。,其中n是向量中的元素数量。原创 2024-02-27 14:37:57 · 683 阅读 · 0 评论 -
std::mutex
如果在规定的等待时间内成功获取锁,就会增加计数器的值。否则,线程会继续执行而不会被阻塞。和其变体是 C++ 中用于线程同步的重要工具。是一种带有超时功能的互斥量,用于多线程编程。在上面的示例中,我们使用 try_lock_for()原创 2024-02-27 14:27:07 · 886 阅读 · 0 评论 -
c++ 智能指针 std::unique_ptr 用法
是 C++11 引入的智能指针之一,用于管理动态分配的对象。让我们深入了解一下它的作用和使用案例。原创 2024-02-27 13:57:43 · 751 阅读 · 0 评论 -
c++中使用lambda表达式的作用和用法
lambda表达式的使用场景有很多,作为小型函数对象,例如在需要一个简单的函数对象时,可以使用lambda表达式来定义一个匿名的函数对象,而不需要定义一个单独的类或结构体。lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。作为临时计算,例如在需要一个简单的计算结果时,可以使用lambda表达式来封装计算逻辑,而不需要定义一个单独的函数。作为回调函数,例如在STL的算法中,可以使用lambda表达式来自定义比较函数、谓词函数、操作函数等。原创 2024-02-27 10:02:31 · 1483 阅读 · 0 评论 -
右值引用,移动语义
这是C++11引入的一项新功能,它可以让我们在不需要拷贝数据的情况下,将一个对象的资源(如内存,文件,网络连接等)转移给另一个对象,从而提高程序的性能和效率。移动赋值运算符**,它们的参数是右值引用,它们的作用是将参数对象的资源转移给当前对象,并将参数对象置为空或无效状态,以避免资源的重复释放。拷贝赋值运算符**,它们的参数是常量左值引用,它们的作用是将参数对象的数据复制给当前对象,并保持参数对象不变,以避免数据的不一致。,将一个对象的数据复制给另一个对象,从而保证两个对象是完全独立的,互不影响。原创 2024-02-26 17:47:54 · 478 阅读 · 0 评论 -
c++ decltype
这是C++98就有的一个运算符,它可以返回一个表达式或者一个类型的std::type_info对象的引用,该对象包含了类型的名称和其他信息。typeid的用法是在一个表达式或者一个类型前加上typeid运算符,例如typeid(x)或者typeid(int),它会返回一个std::type_info对象的引用。typeid的结果可以用name()成员函数来获取类型的名称,但是这个名称是由编译器实现定义的,不一定是可读的或者一致的。typeof也不是C++标准的一部分,所以不建议在可移植的代码中使用它。原创 2024-02-26 17:30:26 · 1356 阅读 · 0 评论 -
了解c++智能指针的使用案例和场景
c++智能指针是一种封装了原始指针的类对象,可以实现自动管理内存的功能,避免手动new和delete造成的内存泄漏或重复释放等问题。原创 2024-02-19 15:57:13 · 794 阅读 · 0 评论 -
c++ 一文彻底搞懂闭包
(3) 闭包是什么, C++和Rust的视角 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/378270921.(6) 闭包是什么, C++和Rust的视角 - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/378270921.(4) C++的闭包(closure) - 知乎 - 知乎专栏. https://zhuanlan.zhihu.com/p/121628510.闭包可以用来实现高阶函数,比如回调函数、函数式编程等¹²。原创 2024-02-19 15:21:12 · 1275 阅读 · 0 评论 -
c++ 中在构造函数中赋值和使用初始化列表有什么区别?
如果我们有一个类成员,它本身是一个类或者是一个结构,而且这个成员它只有一个带参数的构造函数,而没有默认的构造函数,这时要对其进行初始化,就必须调用这个类成员的带参数的构造函数,如果没有初始化列表,就无法完成。当类成员中含有一个const对象时,或者一个引用时,必须经过成员初始化列表进行初始化,因为const对象或者引用在声明的同时必须初始化,而在构造函数中,做的是对它们的赋值,并不是初始化。初始化列表是在对象创建时直接初始化成员变量,而构造函数中的赋值是在对象创建后对已经初始化的成员变量进行赋值。原创 2024-02-02 11:24:50 · 936 阅读 · 0 评论 -
error: use of deleted function ‘std::atomic<int>::atomic(const std::atomic<int>&) 防止原子类型被意外复制
编译错误是因为你使用了被删除的拷贝构造函数`std::atomic::atomic(const std::atomic&)`,它用来防止原子类型被意外复制。`,它们不会调用拷贝构造函数,而是调用其他的构造函数,如`constexpr atomic(__integral_type __i) noexcept`。这样就可以解决你的错误,让你的程序正常编译和运行。这就会调用被删除的拷贝构造函数,导致错误。上面代码中,你使用了拷贝初始化的语法`可以使用直接初始化的语法``或者列表初始化的语法`原创 2024-01-26 14:28:46 · 1353 阅读 · 0 评论 -
二分查找法和使用二分法查找的注意事项
使用二分法查找的必要条件:1、数组有序2、注意数据类型是有范围的,不要溢出。3、采用L+(R-L)/2表达式更合适4、注意:start = mid +1 和 end=mid -1,防止死循环5、数据量不可过大1024个人,有一个人有艾滋病。需要血液检测。如何快速找出这个人。所有人血液都采取过来。把512个人血液混合起来512 512 1次淘汰512个人...翻译 2018-11-28 14:29:32 · 2527 阅读 · 0 评论 -
c++string字符串比较相等
#include <iostream>#include <string>#include <stdio.h>using namespace std;int main(){ std::string h2 = "BUS_0001"; std::string h3 = "BUS_0001"; printf(" h3 == h2:...原创 2020-04-02 18:16:03 · 2907 阅读 · 0 评论 -
上海西井科技面试
以下的问题是总结的我没回答上来或者回答的不好的小结,回答上来的被我省去了。一个面试官面试了一个半小时,感觉这个面试官很nice,知识面比我广和深。踩了那么多雷,估计是没戏了!各位看官,工作不好找,且好好珍惜当下的工作,记住:今天不努力工作,明天努力找工作!1、为什么构造函数不能是虚函数?关于C++为什么不支持虚拟构造函数,Bjarne很早以前就在C++Style and Techn...原创 2019-06-12 17:18:42 · 2941 阅读 · 1 评论 -
c++的四种强制类型转换:static_cast dynamic_cast const_cast reinterpret_cast
dynamic_cast主要用于“安全地向下转型dynamic_cast用于类继承层次间的指针或引用转换。主要还是用于执行“安全的向下转型(safe downcasting)”,也即是基类对象的指针或引用转换为同一继承层次的其他指针或引用。至于“向上转型”(即派生类指针或引用类型转换为其基类类型),本身就是安全的,尽管可以使用dynamic_cast进行转换,但这是没必要的, 普通的转换已...原创 2019-03-19 09:35:24 · 1029 阅读 · 0 评论 -
爱德万C++笔试题
#include <iostream>using namespace std;class Base{ public: virtual void f(float x){cout<<"Base::f(float)"<<x<<endl;} void g(float x){cout<<"Base::g"<<x<<...原创 2019-10-26 21:25:39 · 1221 阅读 · 1 评论 -
爱德万题目
shared_ptr指针的循环引用问题weak_ptr 指针的使用?lockgurad的使用单例模式的线程安全问题try块中,内存分配时出错了怎么办。一个数组 int arr[]={1,2,-5,3,-4,8,9,2,5,-4,2,5,-8},求出数组中的最大子数组...原创 2020-03-14 21:31:36 · 714 阅读 · 0 评论 -
输入一个链表,输出该链表中倒数第k个结点。
输入一个链表,输出该链表中倒数第k个结点。思路1:一次循环得到节点的个数,然后使用节点的个数减去倒数的k,就得到了正数的第count-k个,返回这个节点就可以了。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class...原创 2019-11-04 09:11:30 · 337 阅读 · 0 评论 -
直接插入排序算法实现学习
#include <iostream>using namespace std;void show(int *a,int n){ for(int i=0;i<n;i++) { cout<<a[i]<<"\t"; } cout<<endl;}void InsertSort(int *k,...原创 2018-11-27 11:14:02 · 223 阅读 · 0 评论 -
蛇形数组编程题
偏移量向右(x,y+1) (0,1) 0向下(x+1,y) (1,0) 1向左(x,y-1) (0,-1) 2向上(x-1,y) (-1,0)...翻译 2019-06-27 10:21:26 · 367 阅读 · 0 评论 -
我被面试官虐的面试小结
关于面试我想说:千万不要打没有准备的仗,也不要小看任何一个小的知识点。今天被虐了一次:首先来个下马威面试官:你主要使用的语言是C++,用了多久了?我: 2年。面试官:那么如果给自己的c++技术打分0到100给自己打多少分?我:答75分。(由于听说过有个计算机专业毕业的硕士在面试官面前说自己精通C语言,后来被面试官问一些技术难题给打脸的案例,我就不敢张狂了。)面试官:嗯,75...原创 2019-06-26 20:06:45 · 701 阅读 · 0 评论 -
cmakeList编译protobuf.pb.h时报错fatal error: google/protobuf/port_def.inc: No such file or directory
写一个protobuf文件,编译后会生成两个文件一个.cc和一个.h文件。export LD_LIBRARY_PATH=/usr/local/libprotoc --cpp_out=./ forward_protobuf.proto单独的编译命令:g++ -o pub_boche2.out publish_boche.cpp protoBuf/forward_protobuf.pb.c...原创 2019-12-10 10:23:03 · 10699 阅读 · 1 评论 -
写一个c程序,从一个字符串中提取出关键字后面的数字
#include <syslib.h>#include <string.h>main(){char *s="GoldenGlobalView";char *l="lob";char *p;clrscr();p=strstr(s,l);if(p)printf("%s",p);elseprintf("Not...原创 2019-08-15 21:29:46 · 1472 阅读 · 0 评论 -
c++ 两个vector之间相互赋值,或在一个后面追加另一个
v1 = v2 //原创 2020-06-07 11:35:51 · 13120 阅读 · 1 评论 -
使用程序写出求出1!+2!+...+64!的运算结果。考虑溢出的问题
求10的阶乘的和int n=10;int num1=1;int num2=1;for(int i=1;i<=n;i++){ num1=1; for(int j=2;j<=i;j++) { num1*=j; } sum+=num1;}/*写一个数组,数组每一位存一位数,就可以保存一个很大的数当要处理很大的数的乘法的时候,超出了数据的保存范...原创 2018-12-05 14:12:49 · 317 阅读 · 0 评论 -
排序算法
影响排序算法性能的几个要素:1、时间性能2、辅助空间3、算法的复杂性直接插入排序算法的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的,记录数增加一的有序表。void InsertSort(int k[],int n){ int i,j,temp; for(i=1;i<n;i++) { if( k[...原创 2020-03-14 21:30:01 · 156 阅读 · 0 评论 -
c++11多线程 windows临界区、其他各种mutex互斥量 第十二讲
(1)windows临界区(2)多次进入临界区实验(3)自动析构技术(4)recursive_mutex递归的独占互斥量(5)带超时的互斥量std::timed_mutex和std::recursive_timed_mutex#include <thread>#include <windows.h>#define __WINDOWS__class A{...原创 2020-02-22 18:47:15 · 369 阅读 · 0 评论 -
C++指针漂移问题解决方案
C++指针漂移问题解决方案核心提示:C++编程语言虽然功能强大,应用方式灵活,但是在实际编程中同样会出现各种各样的错误。 C++编程语言虽然功能强大,应用方式灵活,但是在实际编程中同样会出现各种各样的错误。在这里我们将会为大家详细介绍一下有关C++指针漂移的解决方法,希望本文介绍的内容可以帮助大家解决问题。 最近我们在工作中碰到一个奇怪的问题,最后确定是多继承引起的C++指针漂移,...原创 2019-06-25 17:25:37 · 1687 阅读 · 0 评论 -
c++多态特性看懂这一篇就够了
什么是多态?有哪些分类?答:多态是面向对象的重要特性之一,它是一种行为的封装,是同一种事物所表现出的多种形态,简单地说是”一个接口多种实现“有两种类型的多态性:编译时的多态性。编译时的多态性是通过重载来实现的。运行时的多态性。运行时的多态性是通过虚成员实现的。构造函数为什么不能是虚函数?1.从存储空间角度。 虚函数对应一个vtable,这个vtable其实是存储在对象的内存空...原创 2019-11-07 16:25:35 · 878 阅读 · 0 评论