C++ General
文章平均质量分 74
C++
执假以为真
Learning, Coding, Writing
展开
-
C++异常小结
如果一个函数抛出了一个异常,而调用者没有捕获它,则该异常会进入上一层调用者,并且一直继续下去,直到被捕获或者直到main函数中也没有被捕获而导致程序终止。stack unwindingstack unwinding译作"栈反解"或"栈展开"。异常发生处至捕获处(不包含),每一层创建的局部对象都会被销毁。这种局部对象的自动清理就称为 stack unwinding.标准异常一般来说,使用标准异常类比自定义异常类要方便快捷;如果标准类不能满足要求,可以继承它们从而派生出自己的异常类。所有的标准异常类原创 2022-02-06 10:12:47 · 1263 阅读 · 0 评论 -
《Essential C++》读书笔记
《Essential C++》是一本老书了,第一版应该是成书于1999年。这一点在其中文译本中竟没有说明。此书作者便是大名鼎鼎的《C++ Primer》的作者 Stanley B. Lippman, 而中译本的作者也很有名,乃是宝岛台湾的侯捷。相较于《C++ Primer》近千页(第5版)的厚重,《Essential C++》的中译本只有281页,若除去附录部分,则只有204页。这其实是一本相对较简单的初级C++书籍。虽然年代久远,仍是珠玉难掩,其中一些东西还是值得一读。这篇读书笔记,只是笔者本人的一原创 2022-02-05 22:15:44 · 1727 阅读 · 0 评论 -
空基类优化与no_unique_address属性
简介空基类优化和C++20的[[no_unique_address]]属性原创 2022-01-09 22:00:35 · 1382 阅读 · 2 评论 -
C++中的RVO、NRVO与Copy Elision
RVO: Return Value OptimizationNRVO: Named Return Value OptimizationRVO 和 NRVO 都是当函数返回值的时候,编译器所做的优化,目前并不是C++标准所规定的内容,因此各家编译器实现可能有差别,另外当函数比较复杂的时候,也可能不会有RVO或NRVO的优化。Copy Elision 是 C++11 新增移动语义后给出的一种建议,即当返回值时使用移动语义替代拷贝语义以减少内存拷贝;它属于标准的建议,因此编译器是否实现了该优化以及如何实现原创 2022-01-05 23:43:05 · 1062 阅读 · 0 评论 -
简介C++中的模板
科普小文,简介C++中的模板,不涉及艰深内容。模板把类型定义为参数, 从而实现了代码的可重用性,也减少了代码膨胀。模版可以分为两类:函数模版和类模版。类模板支持全特化和偏特化;函数模板仅支持全特化(因为函数模板的重载可实现偏特化的功能)。模板实例化模板定义本身不参与编译,而是编译器根据用户提供的类型参数生成代码,再进行编译。用户提供不同的类型参数,就会实例化出不同的代码。当模板、全特化、偏特化都存在的时候,编译器在编译阶段进行匹配,优先选择最特殊的。类模板的成员函数不能是虚函数编译器在编译原创 2021-10-31 09:42:04 · 387 阅读 · 0 评论 -
用shared_ptr和weak_ptr来实现双向循环链表
用shared_ptr和weak_ptr来实现双向循环链表上篇文章评论了unique_ptr实现的双向循环链表。但其实把unique_ptr改成shared_ptr和weak_ptr,其实还是蛮好用的,就连代码复杂度也比unique_ptr降低了很多。只是即使用了 shared_ptr 和 weak_ptr ,爆栈问题仍是无解。具体方法再描述一遍:用 shared_ptr 表示 next 指针;用 weak_ptr 表示 prev 指针;头节点是一个占位节点,不存有用信息;尾节点的 nex原创 2021-10-23 17:22:27 · 568 阅读 · 0 评论 -
用智能指针来实现基本数据结构会怎么样
近来突发奇想,用智能指针来实现基本的数据结构会怎么样?比如,链表、二叉树等。如果真有这样奇妙的配合,为何以前好像从来没听说过呢?是孤陋寡闻了吗? 不如自己实现一个试试看。看会出现些什么问题。链表好像比树要简单。那么用智能指针实现链表会怎么样呢? 先挑战一下循环双向链表。第一个问题是,选什么智能指针。可选的自然只有3种: unique_ptr, shared_ptr, weak_ptr. weak_ptr 是辅助 shared_ptr 的,可以不算;那么就只有2种了。选 shared_ptr 似乎会原创 2021-10-20 22:42:12 · 402 阅读 · 0 评论 -
手写一个内存池
手写一个内存池这篇文章试着实现了一个最简单的内存池。先说一下这个内存池的缺陷,再说一下这个内存池应用了哪些技术,最后给出代码简述和实现以及运行效果。1. 该内存池的缺点因为是目标是实现一个简单的原型,因此该内存池至少具有如下的缺点:内存池不支持普适的内存分配,只能针对某一种类型(即某一个类)进行内存分配。普适的情况,就有点像是实现一个tcmalloc或jemalloc了,那会非常复杂。内存池不支持多线程。这一点是重大缺陷,但应该不算很难改进。内存池不提供对 operator n原创 2021-10-05 10:57:39 · 465 阅读 · 0 评论 -
C++中的几种new和delete
C++中的几种new和delete在C语言中,使用malloc、calloc来分配堆上的空间,使用free来释放它们分配的空间; malloc、calloc、free都是库函数。在C++中,使用new和delete,以及 new [] 和 delete [] 来分配和释放自由存储区(其实也就是堆)上的空间;它们都是操作符,属于语言的范畴。本文讨论一下C++中的几种new以及delete的作用和实现。1. C++中默认的new和delete默认的new和delete,就是全局的new和delete,原创 2021-10-05 09:56:46 · 296 阅读 · 0 评论 -
C++对象的内存布局
转载自CoolShell:https://coolshell.cn/articles/12176.html介绍C++对象的内存布局转载 2021-05-29 10:23:30 · 690 阅读 · 0 评论 -
C++类的内存布局
关于C++中类的内存布局,是比较基础而重要的一个内容。先转一篇老文章,因其使用了Visual Studio的特殊功能而能够写得很简单清晰,不过当时作者用的应该是32机器,故指针大小是4字节而不是8字节。笔者手头没有Visual Studio,故转载之。也可以按陈皓早年的文章用打印地址的方式分析。不过因为本文的方式非常清晰易懂,故还是想转载下这篇。遇到与64位的不同处,本文会略作说明。本文对原文略作了一些增删: 增加了前2节,对第3节做了不少的删减合并与结构调整,不过基本保留了原图与代码。原文地址:转载 2021-04-18 09:45:13 · 1673 阅读 · 0 评论 -
当调用类的成员函数时,调用的是哪个
想一想,自己写编译器,会怎么实现原创 2021-04-15 22:48:33 · 205 阅读 · 0 评论 -
简介dynamic_cast
dynamic_cast 不为人注意的2个点dynamic_cast < type-id > ( expression)该运算符把expression转换成type-id类型的对象。Type-id可以是类的指针、类的引用或者void*。如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。2个注意点:父类必须含有虚函数。否则编译报错: source type is not polymorp原创 2021-03-29 07:07:41 · 256 阅读 · 0 评论 -
C++指针比较
C++指针比较原创 2021-03-22 22:47:15 · 1820 阅读 · 0 评论 -
C++内存管理全景
转载自:https://mp.weixin.qq.com/s/mLE73t6jVpzGLqoxK_iJcg导语深入理解C++内存管理,一文了解所有C++内存问题,万字长文,建议收藏随着人工智能,云计算等技术的迅猛发展,让Python,go等新兴语言流行了起来,很多人以为C++可能已经过时了,确实,C++编程语言走到今天已经有将近40年的历史了,但它依然是当今的主流语言,我们可以看一下世界权威编程语言排行榜,C++依然是属于第一梯队,C++在金融交易系统,游戏,数据库,编译器,大...转载 2021-02-17 16:41:32 · 614 阅读 · 2 评论 -
在C++中将一个char转换成一个string的10种方法
在C++中将一个char转换成一个string的10种方法原创 2020-12-27 20:26:39 · 42434 阅读 · 3 评论 -
C++的函数对象
函数对象,又叫仿函数或函数子,英文是 function object 或 functor. 一个实现了函数调用操作符(即 operator()) 的类或结构体,就是仿函数。原创 2020-11-29 20:56:19 · 324 阅读 · 0 评论 -
用struct做unordered_map的key
以struct作为unordered_map的key本篇文章着重讨论如何在STL的 unordered_map 中以 struct 作为 key.unordered_map 是STL中的关联容器,自然就是一个模板类。其声明如下:template < class Key, // unordered_map::key_type class T, ..原创 2020-11-28 13:47:25 · 4554 阅读 · 0 评论 -
多维vector去重
对于二维数组,比如 vector<vector> 这样的,如何去重呢?和shell脚本很像。shell脚本是 xxx | sort | uniq ;C++代码要记住3个关键词: sort, unique, erase1> 先sort,然后才可能做unique;2> unique完了之后,iterator指向最后一个元素之后,于是erase从此处至end()即可。这里比较神奇的是sort和unique可以直接比较2个一维 vector<int> 的大小。具体原创 2020-06-11 00:00:11 · 2649 阅读 · 4 评论 -
C++中public、protected、private的权限总结
C++中各种继承的权限总结原创 2019-03-30 11:54:26 · 543 阅读 · 0 评论 -
删除STL容器的元素
很久以前看《Effective STL》看到的。因为有点杂,值得整理一下。1. 删除特定值的元素1.1 序列容器如vector,deque,string,其删除特定值的元素的方法是使用 erase-remove 用法。// 对于vector,deque,string,使用 erase-remove 方法c.erase(remove(c.begin(), c.end(), 999), c....原创 2019-01-06 17:28:45 · 335 阅读 · 0 评论 -
关于stringstream的用法
本文简单介绍了利用stringstream将标准输入(stdin)的内容转换到目标变量的基本用法。原创 2016-08-23 22:23:50 · 967 阅读 · 0 评论 -
std的terminate函数
原文: http://en.cppreference.com/w/cpp/error/terminate本文翻译比较晦涩,可以只是大致了解下,也可以参考原文。翻译 2016-05-29 22:55:21 · 10029 阅读 · 0 评论 -
记一个C++中的疑难杂症
一个宏引发的血案原创 2016-04-04 23:07:44 · 740 阅读 · 0 评论 -
C++的异常安全性
转载一篇老文说明“异常安全”。转载 2016-03-14 22:07:14 · 587 阅读 · 0 评论 -
抛出异常与栈展开(stack unwinding)
解释了什么叫做栈展开(stack unwinding)及其相关知识。转载 2016-03-11 21:03:43 · 1395 阅读 · 0 评论 -
用C++实现一个自动注册的工厂
转载了一篇工厂模式的C++11的实现。转载 2016-03-04 20:26:25 · 2787 阅读 · 0 评论 -
一段有点容易看错的C++程序
一段有点容易被看错的C++程序,实际是正确的。原创 2016-01-13 20:58:15 · 479 阅读 · 0 评论 -
C++标准库笔记之一 Chapter 3 New Language Features
最近想到学习应当持之以恒,而自己对C++ Standard Library一直以来又很有兴趣进行一次系统的学习,因此便开始阅读《The C++ Standard Library: A Tutorial and Reference (2nd Edition)》. 阅读必当实践,因此也顺手按照书本写下多个示例程序,并把它们罗列在属于同一章节或同一主题的一个cpp文件中。写到后面,发现应该把书中的一些重原创 2015-09-04 22:53:32 · 640 阅读 · 0 评论