C++
Go 鹏ya
这个作者很懒,什么都没留下…
展开
-
【C++奇淫技巧&性能优化】emplace_back失败
std::vector<T,Allocator>::emplace_back期望从{1, 2}中推断出参数类型,而{1,2}需要知道它构造的对象类型才能转化为std::initializer_list,否则就大括号括起来的初始化列表。push_back和emplace_back一个特别大的区别在于实例化std::vector之后,push_back的参数是已知的,就是T;而emplace_back的参数是未知的,需要从parameter pack中进行推导。原创 2024-05-03 11:37:00 · 336 阅读 · 0 评论 -
【C++学习笔记】奇淫技巧 - TIsBaseFromBase
【代码】【C++学习笔记】奇淫技巧 - TIsBaseFromBase。原创 2024-04-01 14:33:46 · 112 阅读 · 0 评论 -
【Linux学习笔记】mmap使用时一个注意点,不然会bug
时,最后一个参数offset必须要对齐到p。处,不然会mmap失败。原创 2024-02-29 19:53:03 · 388 阅读 · 0 评论 -
【C++学习笔记】调用模板类的模板函数前必须加template关键字
(这个参数只要显式提供了,不管是确定性还是不确定性),在调用时,就需要在。在调用类模版A中的模版函数sub和add时,若给类模版传的。(int和非模板类等是确定类型),以及。原创 2024-02-13 18:08:02 · 392 阅读 · 0 评论 -
【C++学习笔记】C++多值返回写法
C++不像python可以轻易地处理多值返回问题,处理使用指针或者引用将需要返回的值通过参数带出来,还有几种特殊的方式。原创 2024-01-07 15:46:44 · 553 阅读 · 0 评论 -
【C++学习笔记】编译优化
避免冗余计算、减少函数调用(inline)、循环展开、使用合适数据结构和算法。C++在编译时可以添加优化选项,有4个优化级别。原创 2023-11-14 09:29:22 · 166 阅读 · 0 评论 -
【C++学习笔记】enable_shared_from_this
就可以得到一个智能指针,并且这个智能指针与管理这个对象的智能指针。同时管理一个对象,但是各自的引用计数都是1,导致析构两次,出错。如果想要在类的内部返回一个这个类的智能指针应该先继承。指针去构造了一个智能指针并返回,导致两个智能指针。上面这个代码运行,会出错⚠️。原创 2023-11-12 23:18:51 · 260 阅读 · 0 评论 -
【模型推理优化学习笔记】CUDA加速矩阵乘计算
矩阵乘可以利用gpu多线程并行的特点进行加速计算,但是传统简单的方法需要多次读取数据到寄存器中,增加耗时,因此利用gpu的共享内存可以被一个block内的所有线程访问到的特性,结合tiling技术进行加速计算。原创 2023-11-06 21:34:41 · 514 阅读 · 0 评论 -
【C++学习笔记】C++20的jthread
std::jthread 中的自动join和外部请求中止功能使编写更安全的代码变得更加容易,但其性能上相对于thread也增加了开销。原创 2023-11-03 10:38:45 · 253 阅读 · 0 评论 -
【C++刷题笔记】螺旋矩阵的两种写法
螺旋矩阵有两种判断大循环结束的方式,第一种是判断需要循环多少次,奇数的话需要额外处理;第二种通过取多少个数判断,不需要额外处理。原创 2023-10-01 19:35:41 · 193 阅读 · 0 评论 -
【C++刷题笔记】螺旋矩阵 - 上三角
【代码】【C++刷题笔记】螺旋矩阵 - 上三角。原创 2023-10-01 18:55:10 · 172 阅读 · 0 评论 -
【C++学习笔记】cmake添加源文件的trick
注意点⚠️:采用第一种,如果之前已经cmake编译过,那么新增 .c 文件的话可能会检测不到,需要删掉 build 目录,重新构建。采用第二种,检测到cmakelist.txt有变化,会重新构建。有两个方式可以添加源文件。原创 2023-09-22 19:54:18 · 174 阅读 · 0 评论 -
【Linux学习笔记】消息队列
【代码】【Linux学习笔记】消息队列。原创 2023-09-11 12:32:05 · 249 阅读 · 0 评论 -
【C++学习笔记】超级好用的fmt库
https://mp.weixin.qq.com/s/T55UzIo9spIcljd5hXeUzA原创 2023-09-06 00:32:17 · 55 阅读 · 0 评论 -
【C++/Linux复习知识点】锁
最普通的互斥锁,谁竞争到改锁,谁访问临界资源。原创 2023-07-02 19:29:03 · 262 阅读 · 0 评论 -
【C++/Linux复习知识点】条件竞争
因此可以使用:互斥锁(std::mutex),递归互斥锁(std::recursive_mutex),读写锁(std::shared_mutex)等实现线程同步。条件竞争是由于多个线程竞争操作同一个变量引起的结果不可预测性,例如两个线程同时对一个共享变量读,一个写完另一个写,后者的结果覆盖前者。或者也可以使用原子操作实现,这种原语操作在底层硬件层面上确保了同一时刻只有一个线程可以访问共享变量。需要保证在任何时候只有一个线程操作共享变量。原创 2023-06-30 02:12:13 · 111 阅读 · 0 评论 -
【Linux学习笔记】mmap-共享内存进程通信 vs 有名信号量和无名信号量
另外,如果映射的长度超过了文件长度,访问超过文件长度的映射区也会出错。以上方法虽然实现了父子进程之间的通信,但是每次都要依赖一个文件,如果是一个临时文件,打开后马上进行了 unlink 使文件具备了被释放的条件,在进程结束后文件就被释放,因此这个文件根本就没有存在的必要,可通过匿名映射区避免这种情况。注意:父子进程的内存空间遵循 读时共享、写时复制,但打开的文件和 mmap 建立的存储映射区在父子进程之间是一直共享的,因此可通过 mmap 建立存储映射区实现父子进程之间的通信。有名的sem_t通过。原创 2023-03-09 23:06:38 · 614 阅读 · 0 评论 -
【Linux学习笔记】exec进程替换后,线程是否会被替换
的shell开始输出,且(ps -axj | grep main_pid效果 一样)只有主线程一个执行流,之前进程创建的子线程都被关闭了。从实验可以看出,主线程的tid为12287,两个子线程的tid为12288、12306。在被程序替换后,监听。的shell没有了输出,监听。原创 2023-02-27 15:50:05 · 90 阅读 · 0 评论 -
【Linux学习笔记】进程fork子进程时,会复制父进程中的线程吗
要理解 fork 的原理,Copy On Write 的原理,重点是理解虚拟内存和物理内存的关系。fork 之后,子进程会复制父进程的虚拟内存空间,也就是代码段、数据段、堆栈等,虚拟内存空间里表达的就是程序里各个变量的地址,所以子进程里各个变量的地址和父进程里各个变量的地址是一样的。父子进程只读时,不会发生真实的物理内存拷贝,他们的页映射表内容一致,即同样的虚拟内存地址指向同样的物理内存地址;转载 2023-02-27 10:36:55 · 967 阅读 · 0 评论 -
【C++刷题笔记】回溯-组合startIndex问题
我举过例子,如果是一个集合来求组合的话,就需要startIndex,例如:77.组合 (opens new window),216.组合总和III (opens new window)。如果是多个集合取组合,各个集合之间相互不影响,那么就不用startIndex,例如:17.电话号码的字母组合。原创 2023-02-25 10:17:19 · 113 阅读 · 0 评论 -
【C++刷题笔记】动态规划-背包:一维滚动数组 组合排列技巧
如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。原创 2023-02-21 16:05:06 · 76 阅读 · 0 评论 -
【C语言学习笔记】int和long的范围
链接:https://leetcode.cn/problems/jian-sheng-zi-ii-lcof/solution/di-zi-fen-xi-shi-yong-dong-tai-gui-hua-q-jlr7/本题中给的模数为1 × 10^9 + 7(1000000007),若再乘以3,就超过了int型的范围,所以要使用long存储结果才不会溢出。(1) int型一共32位,有一位作为符号位,其数据范围是-2^31 ~ 2^31,商业转载请联系作者获得授权,非商业转载请注明出处。原创 2023-02-20 17:01:36 · 4171 阅读 · 0 评论 -
【C语言学习笔记】int和long的范围
链接:https://leetcode.cn/problems/jian-sheng-zi-ii-lcof/solution/di-zi-fen-xi-shi-yong-dong-tai-gui-hua-q-jlr7/本题中给的模数为1 × 10^9 + 7(1000000007),若再乘以3,就超过了int型的范围,所以要使用long存储结果才不会溢出。(1) int型一共32位,有一位作为符号位,其数据范围是-2^31 ~ 2^31,商业转载请联系作者获得授权,非商业转载请注明出处。原创 2023-02-18 16:12:26 · 1508 阅读 · 0 评论 -
【C++学习笔记】lambda表达式的mutable
【代码】【C++学习笔记】lambda表达式的mutable。原创 2023-02-08 20:47:23 · 1485 阅读 · 1 评论 -
【C++学习笔记】typename 声明内嵌类型
对于用于模板定义的依赖于模板参数的名称,只有在实例化的参数中存在这个类型名,或者这个名称前使用了 typename 关键字来修饰,编译器才会将该名称当成是类型。要用到一个类模版里面定义的类型时,要么在用这个类模版里面定义的类型时前面加上typename,要么将这个类模版实例化。是个啥,是变量还是类型?默认编译器是识别为变量的,因此clion检测到了错误,vs中就不会有红色波浪形提示。是一个类型,而不再需要等到实例化时期才能确定,因此消除了前面提到的歧义。而自己写迭代器时,还用了typedef,变成。原创 2023-01-04 01:30:23 · 327 阅读 · 0 评论 -
【C++学习笔记】explicit禁止隐式类型转换
会先用 10 进行构造一个匿名对象,然后调用赋值重载对已经存在的a1进行赋值。原创 2022-12-28 15:29:09 · 241 阅读 · 0 评论 -
【Linux学习笔记】字符串切分
字符串切分原创 2022-11-22 16:08:18 · 894 阅读 · 0 评论 -
【Mysql学习笔记】count(1)、count(*)、count(id)和count(字段)
对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。对于count(1)来说,InnoDB引擎遍历整张表,但不取值。server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。)的时候需要把数据一行一行地从引擎里读出来,然后累积计数,但是mysql对count(),MyISAM引擎中直接在磁盘存了表的总行数,因此执行count(原创 2022-10-12 12:28:59 · 1403 阅读 · 0 评论 -
【C++学习笔记】C++ lambda函数 及mutable
mutable修饰符用来指明我们可以对const的变量进行修改,同样,在lambda函数中,也可以使用此修饰符。按值捕获到lambda函数中的变量在函数体中默认是const类型,即不可修改,在添加了mutable修饰符后,便可以对此变量进行修改,但此时仍然修改的是位于lambda函数体中的局部变量,具体的用处类似于函数体中的static变量,只允许在该函数中改变。int n {};// 使用mutable时,参数列表“()”是不可以省略的auto fun = [n] () mutable {.原创 2022-04-16 19:20:21 · 633 阅读 · 0 评论 -
【C++日常学习笔记】迭代器失效
失效举例void test01() { vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); vector<int>::iterator it = v.begin(); ///////////////////////////////////// it = find(v.begin(), v.end(), 2);///原创 2022-01-28 22:27:44 · 322 阅读 · 0 评论 -
【C++日常学习笔记】类直接实例化与调用new/delete的内部细节区别
#include "iostream"using namespace std;class Stack{public: Stack(int capacity=4) :_a(new int[capacity]) ,_size(0) ,_capacity(capacity) { cout << "构造函数" << endl; } ~Stack(){ delete[] _a原创 2022-01-16 19:28:05 · 240 阅读 · 0 评论 -
【C++日常学习笔记】内部类+友元、声明类(前向声明forward declaration)、单参数构造函数隐式类型转换
1、类中单参数构造函数隐式类型转换class AA{public: AA(int b){ _b = b; } void Print(){ cout << _b << endl; }private: int _b;};int main(){ AA a = 10; a.Print(); return 0;}上述main中初始化对象a的方式;常规初始化是AA a(10),这里原创 2021-12-29 20:24:18 · 231 阅读 · 0 评论 -
【C++日常学习笔记】类中的static成员变量
static成员变量性质:1、存在静态区,属于整个类,也属于定义出来的每个对象,被其共享2、跟全局比较而言,它又受类域的限制static的定义需要在类外面单独定义class AA{public: AA(){ ++count_x; } static int GetCount(){ cout << "count是:" << count_x << endl; return count_x;原创 2021-12-28 15:41:27 · 506 阅读 · 0 评论 -
【C++日常学习笔记】初始化列表的必要性
成员变量的初始化工作最好都使用初始化列表1、初始化列表的例子class B{public: B(int b, int x)// 初始化列表 :_b(b) , _aa(x) { _b = 10; }private: int _b; AA _aa;};2、初始化列表的重要性初始化列表可以看作是成员变量的定义(开辟空间),即使我们不写它也会默认有这么一个过程,之前我们知道的创建一个对象时会对内置类型不处理对自定义类型调原创 2021-12-27 23:38:09 · 669 阅读 · 0 评论 -
【C++日常学习笔记】类的空指针访问成员函数
class AA{public: void show(){ cout << "show函数" << endl; } void print(){ cout << "print函数" << " " << _a << endl; }private: int _a; int _b;};int main(){ AA *tmp = nullptr原创 2021-12-26 12:46:17 · 228 阅读 · 0 评论 -
【C++基础学习笔记】五、C++中的类(2)this指针注意点
this指针是一个隐藏的形式参数,其存放在栈中空指针编译器不会编译不通过,只会在程序运行时对空指针解引用访问才会使得程序运行时报错。【面试题】this指针可以为空吗?情况一class A{public: void Show(){ cout << "hello world" << endl; }private: int _a;};int main(){ A* ptr = nullptr; ptr->原创 2021-10-09 14:17:31 · 89 阅读 · 0 评论 -
【C++基础学习笔记】五、C++中的类(1)
1、类的成员函数定义1、成员函数声明和定义(实现)都放在类体中;此时编译器会当作内联函数处理// .hclass Add{public: int add (int a, int b = 1){ return a + b; }private: int _userName = 1;};2、声明放在.h的类体中,定义(实现)放在.cpp中//.hclass Add{public: int add (int a, int b = 1);pri原创 2021-10-09 13:55:55 · 200 阅读 · 0 评论 -
【C++基础学习笔记】四、C++中auto和基于范围的for循环
auto关键字可以自动推导变量的类型,而不需要我们手动定义。(auto定义时也必须需要初始化) int a = 1; char b = 'x'; auto A = a; //不需要再 int A = a auto B = b;可以用typeid(A).name来查看变量的类型1、auto声明指针类型在这里,auto与auto*没有任何区别 int a = 1; auto pa1 = &a; auto *pa2 = &a;原创 2021-10-09 11:32:33 · 242 阅读 · 0 评论 -
【C++基础学习笔记】三、C++中的引用(2)
1、传值和传引用以值作为参数或者返回值时,传过去或者饭回来时,函数不会直接传递自己本身或者返回自己本身,而是传递或者返回需要的值的一份临时拷贝。因此,当数据量非常大时,不断地拷贝这是非常费时的,效率低下。2、引用和指针的异同引用:引用语法上就是一个内存空间的别名,没有自己独立的空间,与其引用的实体(本名)共用一块空间,操作相同。指针:指针有自己的空间,用来存放指向对象的地址。引用在底层实现上,引用是按照指针的方式来实现的,也是有空间的。指针和引用不同点:引用必须初始化,指针没要求引用在原创 2021-10-09 10:28:15 · 100 阅读 · 1 评论 -
【C++基础学习笔记】三、C++中的引用(1)
1、引用概念C++中 引用 的概念表示给当前的变量重新取一个名字(别名),但其表示的内存空间还是同一块。引用符号为&,最简单的引用如下:int x = 10;int& b = x;b作为变量x所指向空间的另一个名字,与x的地位是等同的,改变b则x的值也会改变。注意:引用类型和引用的实体必须是同种类的,跨种类不是不可以而是会出现问题(本文最后会介绍)2、引用性质引用有几个性质如下:引用必须在定义时初始化。一个变量可以有多个引用。一个引用一旦在初始化时引用了一个实体(变原创 2021-09-27 22:47:31 · 195 阅读 · 2 评论