C++基础
文章平均质量分 68
无趣的人民艺术家
这个作者很懒,什么都没留下…
展开
-
shared_ptr的线程安全
文章目录1. shared_ptr的线程安全2. shared_ptr 的数据结构3. 多线程无保护读写 shared_ptr 可能出现的 race condition1. shared_ptr的线程安全shared_ptr 的引用计数本身是安全且无锁的,但对象的读写则不是,因为 shared_ptr 有两个数据成员,读写操作不能原子化。根据文档(http://www.boost.org/doc/libs/release/libs/smart_ptr/shared_ptr.htm#ThreadSafet转载 2021-04-25 11:45:24 · 3289 阅读 · 0 评论 -
构造函数、析构函数抛出异常的问题
目录引子1. 抛出异常1.1 抛出异常语句格式1.2 嵌套调用的异常处理时机2.构造函数可以抛出异常吗?3.析构函数可以抛出异常吗?3.1 more effective c++提出析构函数不能抛出异常的两点理由4.如何处理析构函数中的异常?4.1 析构函数内部消化异常4.2主动关闭程序4.3把可能抛出异常的代码移出析构函数引子先看一个程序,会输出什么?struct A{ A() { cout << "A" <<...原创 2021-04-10 23:05:04 · 918 阅读 · 0 评论 -
C/C++函数调用的几种方式总结
目录1、为什么需要指定函数调用方式?2、常见的函数调用方式2.1 stdcall2.2 cdecl2.3fastcall2.4thiscall1、为什么需要指定函数调用方式?调用函数时,计算机常用栈来存储传递给函数的参数。在参数传递中,有两个重要的问题必须要明确说明:1. 当参数个数多于一个时,按照什么顺序把参数压入堆栈;2. 函数调用后,由谁来把堆栈恢复原状。C/C++通过函数的调用方式来说明这两个问题的2、常见的函数调用方式stdcall..原创 2021-03-15 11:21:14 · 1019 阅读 · 0 评论 -
C/C++ memmove与memcpy的区别及实现
目录1.函数原型2.与字符串函数strcpy区别3.函数说明4.拷贝情况5.代码实现5.1 memcpy5.2 memmove1.函数原型void* _memcpy(void* dest, const void* src, size_t count);void* _memmove(void* dest, const void* src, size_t count);2.与字符串函数strcpy区别memcpy与memmove都是对内存进行拷贝可以原创 2021-03-07 22:50:47 · 145 阅读 · 0 评论 -
C/C++ 对常见字符串库函数的实现
在C中的string.h头文件中存在很多对字符串进行操作的函数,利用这些函数可以方便的对字符串进行操作。下面将对常见的字符串函数进行解释和实现。1、strcpy函数原型:char* _strcpy(char* dest,char* src)函数功能:将str所指由nullptr的字符串复制到dst所指的数组中,并返回dest的指针。函数说明:保证src和dest所指内存区域不能重叠且dest必须有足够的空间来容纳src的字符串。函数实现:char* _strcpy(char* dest, co转载 2021-03-07 21:52:41 · 124 阅读 · 0 评论 -
enable_shared_from_this类的作用和实现
目录问题:如何安全地将this指针返回给调用者enable_shared_from_this的实现分析问题:如何安全地将this指针返回给调用者一般来说,我们不能直接将this指针返回。想象这样的情况,该函数将this指针返回到外部某个变量保存,然后这个对象自身已经析构了,但外部变量并不知道,此时如果外部变量使用这个指针,就会使得程序崩溃。使用智能指针shared_ptr看起来是个不错的解决方法。但问题是如何去使用它呢?我们来看如下代码:struct Bad{ std:.原创 2021-02-12 07:43:05 · 420 阅读 · 0 评论 -
C++的new和delete详解
1、new操作符的三种使用方式plain new,nothrow new和placement new。(1)plain new顾名思义就是普通的new,只是用于分配内存。在C++中是这样定义的:void* operator new(std::size_t) throw(std::bad_alloc);void operator delete(void *) throw();提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返原创 2021-02-07 15:45:59 · 539 阅读 · 0 评论 -
C语言内存对齐和结构补齐
一、为什么要字节对齐?32位CPU是以双字(DWORD)为单位进行数据传输的,因此我们的数据无论是8位或16位都是以双字进行数据传输。比如,一个int类型4字节的数据如果放在上图内存地址1开始的位置,那么这个数据占用的内存地址为1~4,那么这个数据就被分为了2个部分,一个部分在地址0~3中,另外一部分在地址4~7中,又由于32位CPU以双字进行传输,所以,CPU会分2次进行读取,一次先读取地址0~3中内容,再一次读取地址4~7中数据,最后CPU提取并组合出正确的int类型数据,舍弃掉无关数据。那么反过原创 2021-01-30 15:55:21 · 455 阅读 · 0 评论 -
搞懂C++ 对象的内存布局这一篇就够了(代码图文详解)
C++中的虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”,这是一种泛型技术。所谓泛型技术,说白了就是试图使用不变的代码来实现可变的算法。比如:模板技术,RTTI技术,虚函数技术,要么是试图做到在编译时决议,要么试图做到运行时决议。虚函数表对C++了解的人都应该知道虚函数(Virtual Function)是通过一张虚函数表(Virtual Table)来实现的。简称为..原创 2021-01-30 15:36:14 · 616 阅读 · 0 评论 -
宏定义中 #和##的区别
1、#构串操作符# 将右边的宏参数做整体的字符串替换。 #define STRING(x) #x#x #define TEXT(x) "A"#x"A" int main() { printf("%s\n", STRING(Test)); printf("%s\n", TEXT(Test)); getchar(); } STRING(Test) --->宏展开--->...原创 2021-01-28 22:06:56 · 287 阅读 · 0 评论 -
C++11/14 constexpr 用法
1、constexpr 和 constconst 的原本和基础的含义是表示它修饰的内容不会变化,本质上,const 用来表示一个运行时常量。如: const int n = 1; n = 10; //报错 但是我们依然可以通过指针来修改n在内存中的数据 const int n = 1; int* p = (int *)&n; *p = 10; std::cout <<...原创 2021-01-28 22:05:13 · 468 阅读 · 2 评论 -
泛型编程:编译期类型检查
用 C11引入的true_type 和 false_type 来选择合适的重载,利用这个我们可以在编译期通过标签分发(tag dispatch)来限制输入参数类型,比如格式化字符串的时候,string类型错误并不会报错,但是运行期会导致崩溃1、我们下看下true_type 和 false_type的定义: // TEMPLATE CLASS integral_constant template<class _Ty, _Ty _Val> st...原创 2021-01-28 21:51:53 · 343 阅读 · 0 评论 -
函数对象和lambda:函数式编程
1、C++98 的函数对象从概念上来说,函数对象是一个可以被当作函数来用的对象。它有时也会被叫做 functor,代码看一个函数对象: struct CAverage { public: double operator()(int a1, int a2) { //重载()运算符 return (double)(a1 + a2) / 2; } }; int main() ...原创 2021-01-28 21:49:10 · 67 阅读 · 0 评论 -
自己动手,实现C++的智能指针
智能指针,可以简化资源的管理,从根本上消除资源(包括内存)泄漏的可能性。其实,智能指针本质上并不神秘,其实就是 RAII 资源管理功能的自然展现而已,下面提供一种实现。/*******************************************************文 件: CSmartPoint.h描 述: 智能指针类,不支持多线程操作修 改:********************************************************/#pra原创 2021-01-13 21:20:43 · 284 阅读 · 0 评论