C++
文章平均质量分 65
First Snowflakes
捡贝壳
展开
-
c++ ref在thread和bind中的使用
std::ref对std::threadstd::mutex删除了拷贝构造函数。构造std::thread时,给线程函数传参时默认采用的是值传递(即使线程函数的入参为引用形式,这样设计应该时考虑到多个线程同时引用一个变量时的生命周期安全问题吧), 所以被传参数对应的是含有mutex成员的类的实例时,编译不通过,需要使用std::ref。#include <iostream>#include <thread>#include <mutex>#includ..原创 2022-05-08 18:30:03 · 967 阅读 · 0 评论 -
C++ placement new --geeksforgeeks
Placement new operator in C++ - GeeksforGeeksA Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.原创 2022-03-06 17:49:30 · 499 阅读 · 0 评论 -
Gcc tips
利用Address Sanitizer工具检查内存gcc从4.8版本起,集成了Address Sanitizer工具,可以用来检查内存访问的错误(编译时指定“-fsanitize=address”)。以a.c程序为例:gcc -fsanitize=address -g -o a a.c利用Address Sanitizer工具检查内存访问错误 | 100个gcc小技巧介紹 | 100个gcc小技巧...原创 2022-02-27 11:59:01 · 104 阅读 · 0 评论 -
类的成员函数中可以访问同类型实例的私有成员
为什么C++中复制构造函数可以调取其他对象中的私有变量 - 不断学习中渐渐不彷徨 - 博客园原创 2022-01-20 21:07:32 · 604 阅读 · 0 评论 -
C++ 虚函数表放在哪里
Ref:虚函数表放在哪里_vicness的专栏-CSDN博客_虚函数表存在什么位置原创 2021-11-22 21:15:26 · 953 阅读 · 0 评论 -
C++之虚继承
编译器对虚拟继承的处理可参考《深度探索C++对象模型》Data语义学部分。class Base {public: Base() { cout << "Base() is called!" << endl; } virtual void f() {}};class A : public Base {public: A() { cout << "A() is called!" << endl; } virtual voi...原创 2021-04-24 23:08:56 · 206 阅读 · 0 评论 -
c++之diamond problem
class Base中定义virtual函数,virtual void f(); class A和class B继承自class Base,并重写了基类的虚函数virtual void f(); class C继承自A和B, 如果class C中不实现 virtual void f()的话,编译器会报错,因为,不清楚class C使用A的还是B的f();Diamond problem:The "diamond problem" (sometimes referred to as the "de..原创 2021-04-24 22:37:40 · 360 阅读 · 0 评论 -
C++11标准模板库之async
C++11中的std::async是个模板函数。std::async异步调用函数,在某个时候以Args作为参数(可变长参数)调用Fn,无需等待Fn执行完成就可返回,返回结果是个std::future对象。Fn返回的值可通过std::future对象的get成员函数获取。一旦完成Fn的执行,共享状态将包含Fn返回的值并ready。std::async有两个版本:1.无需显示指定启动策略,自动选择,因此启动策略是不确定的,可能是std::launch::async,也可能是std::launch:...原创 2021-02-13 21:21:16 · 245 阅读 · 0 评论 -
C++11 STL之future and promise
A future is an object that can retrieve a value from some provider object or function, properly synchronizing this access if in different threads."Valid" futures are future objects associated to a shared state, and are constructed by calling one of the ..原创 2021-02-13 21:11:13 · 316 阅读 · 1 评论 -
C++ C中的size_t
Ref:https://jeremybai.github.io/blog/2014/09/10/size-t原创 2021-01-06 12:37:38 · 185 阅读 · 0 评论 -
C++ new、operator new、placement new
new和delete操作符我们都用过,它们是对堆中的内存进行申请和释放,要实现不同的内存分配行为,需要重载operator new,operator delete。operator new 就像operator+一样,是可以重载的,但是不能在全局范围对原型为 void operator new(size_t size) 这个函数进行重载,一般只在类中进行重载(也可以重载全局的new)。如果类中没有重载operator new,那么调用的就是全局的::operator new来完成堆的分配。同理...原创 2021-01-04 22:00:45 · 284 阅读 · 0 评论 -
C++11 中的 emplace
C++11中大部分的容器对于添加元素除了传统的 insert 或pusb_back/push_front 之外都提供一个新的函数叫做emplace。 比如,如果你想要向 std::vector 的末尾添加一个数据,你可以:std::vector<int> nums; nums.push_back(1);你也可以使用:std::vector<int> nums;nums.emplace_back(1);避免不必要的临时对象的产生emplace...原创 2021-01-04 21:01:44 · 520 阅读 · 0 评论 -
c++11 实现读写锁
Note: C++ 17里已经引进了读写锁 std::shared_mutex , 其lock()即以写方式加锁, 其lock_shared()即以读方式加锁。https://en.cppreference.com/w/cpp/thread/shared_mutex实现一个读写锁类, 可以有两种方式获取锁,读方式,写方式。 允许多个"读线程"同时进入临界区,但是同一时刻只允许一个"写线程"进入临界区。当有写线程进入临界区时,不允许任何其他读或写线程同时进入。 写线程优先。方法:在类中增加成...原创 2020-11-25 22:34:43 · 7365 阅读 · 3 评论 -
前置声明属于一个命名空间内的类
Class spaceDeclTest属于TestA这个命名空间:#pragma once#include <iostream>namespace TestA { class spaceDeclTest { public: void print(); };}TestA的实现:#include "spaceDeclTest.h"using namespace TestA;void spaceDeclTest::pri...原创 2020-11-24 08:45:37 · 1222 阅读 · 0 评论 -
C++ Abstract class vs Interface
Abstract classAn abstract class is, conceptually, a class that cannot be instantiated and is usually implemented as a class that has one or more pure virtual (abstract) functions.A pure virtual function is one which must be overridden by any concrete...原创 2020-11-20 08:54:08 · 473 阅读 · 1 评论 -
C++的最小整数和最大整数 -- limits.h头文件
需要定义最大值,最小值时,可以方便使用。原创 2020-11-15 21:25:42 · 635 阅读 · 0 评论 -
C++ 11 thread之join、detach
Please refer to <C++ concurrency in actioin, second edition> chapter 2.1.原创 2020-11-15 21:14:09 · 204 阅读 · 0 评论 -
C++11之 final, override关键字
final1. 阻止类被继承C++11中允许将类标记为final,即直接在类名称后面使用关键字final,这样编译器会阻止该类被其他类继承,否则编译器报错。class specialArray final{public: specialArray() {}; virtual ~specialArray() {};};2. 禁止子类重写基类的虚函数, 注意:只能用于virtual函数。override关键字https://en.cppref...原创 2020-11-15 20:52:56 · 304 阅读 · 0 评论 -
C++ STL之unique_lock与lock_guard
std::lock_guardhttp://www.cplusplus.com/reference/mutex/lock_guard/用于托管一个mutex 变量,负责对齐加锁解锁。A lock guard is an object that manages a mutex object by keeping it always locked.On construction, the mutex object is locked by the calling thread, and ...原创 2020-11-15 12:02:17 · 1030 阅读 · 0 评论 -
c++ 11实现一个定时器,周期性地执行指定的task
可以直接使用c++11的thread, mutex, conditon_variable来实现, 结合了std::function.Note:1)start函数,开辟一个新的线程,并detach,在这个线程中周期性地执行task。 建立一个std::thread线程时,需要传入一个可调用对象,这里使用了lambda函数,非常方便。 start函数的入参是,周期时间ms,以及一个std::function<void()>2) 使用了c++11的原子变量...原创 2020-11-15 11:16:27 · 11866 阅读 · 0 评论 -
C++中的四种类型转换
1 static_caststatic_cast < type-id > ( expression )static_cast更有利于检查出危险的类型转换:https://blog.csdn.net/u010857719/article/details/522700831 基本类型之间的转换,如把int转换成char,把int转换成enum。这种转换的安全性也要开发人员来保证.但不能用于不同指针类型之间的类型转换float af = 3.0f;double*...原创 2020-11-03 22:00:16 · 1730 阅读 · 0 评论 -
关于static变量的文件作用域
Scenario A :在一个头文件中都有staic int a=9; 然后,此头文件被多个cpp文件包含,不会报错,因为static的变量具有文件作用域。如果去掉static,则报错重复定义错误了。Scenario B:在a.cpp中定义两个全局变量:static int gStaticA = 8;int gNostaticA = 9;然后,在另一个cpp文件中可以通过extern int gNostaticA;来使用a中定义的该变量; 但是不能extern int ...原创 2020-11-01 11:05:32 · 918 阅读 · 0 评论 -
static变量的构造时间 以及 C++11保证了static局部变量的线程安全
在C++标准草案的6.7:such a variable is initialized the first time control passes through its declaration; such a variable is considered initialized upon the completion of its initialization. If the initialization exits by throwing an exception, the initi...原创 2020-11-01 10:55:57 · 958 阅读 · 0 评论 -
C++编译器在编译阶段对指针(引用)调用虚函数的处理
关于c++虚函数多态的内部机制,有些经典的书籍已经给出了详细的阐述,例如侯捷先生的《深度探索C++对象模型》。在此做些小总结。>类的存储空间:1) 含有虚函数的类有一个虚函数表,存储各个虚函数的地址。2) 每个对象有一个虚函数指针,指向该其所属类的虚函数表;编译期间, 编译器会为每一个含有虚函数的类生成一个虚函数表, 这个虚函数表的大小必须在编译阶段确定下来,这也导致了模板函数不能为虚函数(https://blog.csdn.net/qq_35865125/artic...原创 2020-10-27 22:58:42 · 757 阅读 · 0 评论 -
char与signed char, unsigned char的区别
三者之间关系1) ANSI C 提供了3种字符类型,分别是char、signed char、unsigned char。而不是像short、int一样只有两种(int默认就是unsigned int).2) 三者都占1个字节.3) signed char取值范围是 -128 到 127(有符号位), unsigned char 取值范围是 0 到 255.4) 内存中一串二进制,它的含义,就是这个类型来说明的。5) 所谓signed char 和 unsigned cha...原创 2020-10-27 21:50:39 · 4067 阅读 · 0 评论 -
c++ 11 STL之is_same
基本概念以及用法https://en.cppreference.com/w/cpp/types/is_same头文件:#include <type_traits>std::is_same是一个类!eg.#pragma once#include <iostream>#include <type_traits>int main() { //bool bVar = std::is_same<int, float>::v...原创 2020-10-27 21:35:33 · 1137 阅读 · 0 评论 -
heap内存模型
https://blog.csdn.net/qq_25072517/article/details/89852643#include "stdlib.h"#include "stdio.h"https://blog.csdn.net/mmshixing/article/details/51679571https://blog.csdn.net/qq_37764129/article/details/81705651?utm_medium=distrib...原创 2020-10-27 09:24:09 · 240 阅读 · 0 评论 -
C++ 在函数内部调用同名全局变量
采用::操作符实现:int gVar = 3;void func() { int gVar = 9; printf("global val = %d, local val = %d \n",::gVar, gVar);}int main() { func();}Note: 在C中,并没有域操作符。域操作符的几种用法:分为三种:全局作用域符,类作用域符,命名空间作用域符全局作用全局作用域符号:当全局变量在局部函数中与其中某个变量重名,那么...原创 2020-10-27 09:22:37 · 2980 阅读 · 1 评论 -
C++类中的虚函数不能为模板函数
C++类中的虚函数不能为模板函数首先,理解模板的原理。例如,定义了一个模板函数:template<typename A>void Func(const A& a) { std::cout <<"Func(const A& a) : "<< a << std::endl;}编译器在编译期间,会检查代码中哪些地方使用了这个函数,例如,如果在整个程序中使用到了两种类型:Func<int>(9);Func...原创 2020-10-23 08:49:06 · 7837 阅读 · 2 评论 -
C++: 类型擦除(type erasure)
在 C++ 中,编译器在编译期进行的静态类型检查是比较严格的,但有时候我们却希望能“避过”这样的类型检查,以实现更灵活的功能,同时又尽量地保持类型安全。听起来很矛盾,而且貌似很难办到。但其实 C++ 的库里已经有很多这样的应用了。比如,著名的 boost::function 和 boost::any 。当我们定义一个 function<void(int)> fun 对象,则 fun 即可以存储函数指针,又可以存储函数对象,注意,这两者是不同“类型”的,而且函数对象可以是无限种类型的...原创 2020-10-23 08:48:39 · 1499 阅读 · 0 评论 -
C++ 并发-lock_guard与unique_lock
Ref:https://www.cnblogs.com/xudong-bupt/p/9194394.htmlhttps://zh.cppreference.com/w/cpp/thread/unique_lock原创 2020-10-09 22:48:07 · 121 阅读 · 0 评论 -
c++支持函数重载, c语言不支持!
对于一个函数,例如void fun(int x); c++中,编译器会对该函数名进行修饰,例如,变为_fun_int, 而,C语言中,编译器对函数名不会根据入参进行修饰,从而,如果c语言中两个函数的名字如果相同,即使入参不同,也会产生链接错误。...原创 2020-10-07 23:01:30 · 118 阅读 · 0 评论 -
字节对齐 #pragma pack指令
#pragma pack用于指示编译器,设置数据在内存中的对齐方式。#pragma pack (n) 作用:编译器将按照n个字节对齐。Ref:https://blog.csdn.net/sweetfather/article/details/78487563原创 2020-10-07 22:50:00 · 240 阅读 · 0 评论 -
两个线程交替打印的各种解决方法
题目:https://leetcode-cn.com/problems/print-foobar-alternately/方法1:模仿信号量机制,使用两个整数来控制先后执行顺序。class FooBar {private: int n;public: FooBar(int n) { this->n = n; } void foo(function<void()> printFoo) { for (int i = 0; i < n;...原创 2020-09-28 23:22:41 · 934 阅读 · 0 评论 -
C++11条件变量--condition_variable
C++条件变量--std::condition_variable使用:1)原创 2020-09-28 23:20:06 · 357 阅读 · 0 评论 -
C++ STL之recursive_mutex
MutexLock mutex; void foo() { mutex.lock(); // do something mutex.unlock(); } void bar() { mutex.lock(); // do something foo(); mutex.unlock(); } foo函数和bar函数都获取了同一个锁,而bar函数又会调用foo函数。如果MutexLock锁是个非递归锁,则这个程序会立即死.原创 2020-09-27 23:35:01 · 347 阅读 · 0 评论 -
仿函数functors与函数对象function objects
仿函数是早期的名称,c++标准规格定案后所采用的新名称是函数对象。仿函数是一个行为类似函数的对象。 为了能够 “行为类似函数”,其类别定义中必须自定义function call运算子(operator() )。拥有这样的运算子后,我们就可以在仿函数对象后面加上一对小括号,以此调用仿函数所定义的operator()。class A {public: int operator() (int a, int b) { return a + b; }};int m.原创 2020-09-27 23:24:35 · 461 阅读 · 0 评论 -
C 标准库 - <assert.h>以及在cpp中的使用
C 标准库的 assert.h头文件提供了一个名为 assert 的宏,它可用于验证程序做出的假设,并在假设为假时输出诊断消息。Note:用#include <assert.h> 而不是#include <assert>进行包含!assert 原型:void assert (int expression); 说明:aserrt 是一个宏而非函数,实际并不具有函数原型。当它被执行时,判断 expression 的真假,如果为假,它就向标准错误打印....原创 2020-09-27 22:22:50 · 387 阅读 · 0 评论 -
C++函数隐藏
1) 假设派生类的函数与基类的函数同名,可是参数不同(参数的类型、个数或顺序不同)。此时,不论有无virtual keyword,基类的函数将被隐藏。2) 假设派生类的函数与基类的函数同名。而且参数也同样,可是基类函数没有virtual keyword。此时,基类的函数被隐藏。...原创 2020-09-27 21:52:11 · 906 阅读 · 0 评论 -
对外发布的api,升级后某些接口被费掉 如何通知客户
对外发布的api,升级后某些接口被费掉 如何通知客户:onGoing原创 2020-08-27 23:11:01 · 186 阅读 · 0 评论