c++基础
电影旅行敲代码
垃圾文章制造者
展开
-
GCC中的COW(Copy On Write)
文章目录什么是COWCopy Elision实现可能实现libstdc++的实现有什么问题COW与C++11有什么关系呢如何触发libstdc++分配内存时的bookkeeping information待总结In the GCC 5.1 release libstdc++ introduced a new library ABI that includes new implementatio...原创 2020-02-01 20:52:47 · 1386 阅读 · 0 评论 -
std::variant visitor与pattern matching
业余民科,拾人牙慧,垃圾内容std::variant我在《CppCon 2016: Ben Deane “Using Types Effectively" 笔记》中提到了Ben认为std::variant和std::optional是C++最重要的新特性。但是在笔记中,我只提到了std::variant是type-safe的union,与ML或者Haskell中pattern matching...原创 2019-11-26 12:54:53 · 732 阅读 · 0 评论 -
CppCon 2016: Ben Deane “Using Types Effectively" 笔记
与视频内容重复std::optional && std::variantoptionalstd::optional是由A proposal to add a utility class to represent optional objects提出来的?里面详细介绍了std::optional的设计以及背后的原因。cppreference里面详细介绍了std::option...原创 2019-11-24 16:17:41 · 245 阅读 · 0 评论 -
C++中的out-of-line虚函数
引子在现实编码过程中,曾经遇到过这样的问题“warning:’Base’ has no out-of-line method definition; its vtable will be emitted in every translation unit”。由于对这个warning感兴趣,于是搜集了相关资料来解释这个warning相关的含义。C++虚表内部架构Vague Linkageout-原创 2015-12-03 16:37:46 · 5942 阅读 · 1 评论 -
static_cast<>在CRTP中的应用
CRTP是C++中实现静态多态(static polymorphism)的方式,这种实现方式能够提高运行时效率及减少内存消耗,在嵌入式领域相当有优势。这里估计会有人反驳,难道针对每个派生类实例化独有的基类难道不占有内存吗?编译时,实例化的独有基类确实会增加很多类型信息,但是这仅仅是类型信息,只存在于编译期。程序占内存的大小取决于数据段和代码段的大小,代码段只是一条条的汇编指令,里面根本没有类型信息,原创 2015-11-03 21:28:03 · 933 阅读 · 0 评论 -
C++一种智能指针的实现
引子C++智能指针shared_ptr<>以对象管理资源一种智能指针的实现C++智能指针shared_ptr<>为了兼容C语言,并且由于垃圾回收的性能原因,C++没有引入垃圾回收。但是动态内存分配又是现实编码中不可或缺的一部分,由程序员自己控制分配和回收。C++11添加了智能指针shared_ptr<>,相当于使用另一种方式间接实现了部分垃圾回收。shared_ptr是模板,可以指向多个类型原创 2015-11-04 11:29:19 · 764 阅读 · 0 评论 -
自定义类型使用range-based for loops
Range based for loops(范围for循环)在https://reviews.llvm.org/D42300#inline-369356 中被提建议使用range based for loop,但是在我印象中range based for loop只被用在了c++11容器中,当时还在想有些鸡肋,就没有往下深究。但是range based for loop确实可以被用在用户自定义原创 2018-01-27 17:46:48 · 2184 阅读 · 0 评论 -
llvm::ArrayRef和llvm::StringRef
llvm中的一个bug工作中遇到了一个关于关于llvm::ArrayRef和std::vector的内存bug,这个bug涉及到llvm::ArrayRef的实现以及相关的概念,这里做相关介绍。该bug由[Bash-autocompletion] Add support for static analyzer flags引入,引起的bug见Revert r311552: [Bash-autocomp原创 2018-02-04 15:54:45 · 3363 阅读 · 0 评论 -
llvm:: IntrusiveRefCntPtr
boost::intrusive_ptr在介绍llvm::IntrusiveRefCntPtr之前,先介绍intrusive_ptr的概念,intrusive_ptr也是智能指针的一种,同样避免内存泄漏的安全问题,并且intrusive_ptr也是基于RAII实现的。但intrusive_ptr与shared_ptr也有一些不同,最本质不同就是计数器存放的位置。对于std::shared_pt...原创 2018-04-14 17:48:51 · 639 阅读 · 0 评论 -
__builtin_addressof
__builtin_addressof__builtin_addressof是由Richard Smith提交到clang中的,提交的patch为Add a __builtin_addressof that performs the same functionality as the built-in,commit message如下:Add a __builtin_addressof...原创 2018-04-15 17:30:10 · 1896 阅读 · 2 评论 -
clang static analyzer中的数据结构及内存分配策略 - ImmutableMap & ImmutableSet篇
clang static analyzer中使用到的数据结构注:这篇博客的初衷来源于[Analyzer] Attempting to speed up static analysis clang static analyzer中使用到的数据结构大致有以下几种,ImmutableMap,ImmutableSet,FoldingSetNode,SmallVector,StringRef以及Arr...原创 2018-04-21 18:50:14 · 1619 阅读 · 0 评论 -
CppCon 2018: Jason Turner “Applied Best Practices”总结一 :why noexcept?
什么是noexcept在CppCon 2018上,Jason Turner在talk《Applied Best Practices》中提出总结了几点best practices,我会通过几篇文章做一些笔记,本文章对c++11中noexcept进行一些总结。noexcept specifiernoexcept specifier: Specifies whether a function c...原创 2018-11-25 20:05:26 · 436 阅读 · 0 评论 -
static_cast<>能够适用所有转型吗,有什么条件
CheckStaticCast - Check that a static_cast(SrcExpr) is valid.Refer to C++ 5.2.9 for details. Static casts are mostly used for making implicit conversions explicit and getting rid of data loss warnings.原创 2015-11-03 21:20:47 · 2771 阅读 · 0 评论 -
C++中的new/delete和new[]/delete[]
引子C++的new/deleteC++的new[]/delete[]C++的new/delete当我们使用一条new表达式时:// new表达式string *sp = new string("a value");string *arr = new string[10];实际执行了三步操作,第一步:new表达式调用一个名为operator new(或者operator new[])的标准库原创 2015-11-07 17:27:20 · 810 阅读 · 0 评论 -
C++中的volatile
引子在阅读代码的过程中,相信大家都遇到过”volatile”这个关键字,有的人知道和编译器优化相关,甚至有的人根本不知道该关键字的功用volatile A type qualitier that you can use to declare that an object can be modified in the program by the hardware. —[volatile]考虑下原创 2015-11-09 11:30:55 · 649 阅读 · 0 评论 -
由C++构造函数初始值列表想到的
引子大家在编写C++代码的时候,总是会遇到下面这个问题,什么时候为构造函数提供初始值列表(当然,推荐做法都是以初始值列表代替构造函数体内赋值)。数据成员初始化动作是在构造函数体之前的,相对应的,析构函数的数据成员销毁动作是在析构函数体之后的。所常见的必须提供初始值列表的情况有,数据成员含有const成员变量数据成员含有引用数据成员中自定义类型没有默认构造函数前面两个比较好理解,原创 2015-11-10 20:30:21 · 716 阅读 · 0 评论 -
C++实现机制RTTI
运行时类型识别(run-time type identification, RTTI)的功能由两个运算符实现:typeid运算符,用于返回表达式的类型。dynamic_cast<>运算符,用于将基类的指针或引用安全的转换成派生类的指针或引用。C++中没有JAVA中的反射机制,在运行时获得任何对象的类型信息,通常类型信息还非常丰富。C++只针对内置类型和多态的自定义类型实现了RTTI。C++引入原创 2015-11-03 21:05:56 · 1316 阅读 · 0 评论 -
C++11中的POD和Trivial
引子在介绍C++11的文章或者博客中,经常会出现POD类型和Trivial类型的影子。但是POD类型和Trivial类型到底是什么意思呢?POD类型POD类型的好处POD类型粗略上来讲,POD是C++为兼容C的内存布局而设计的,主要用于修饰用户自定义类型。但POD却远比这个要复杂。POD(Plain Old Data),从字面意思上来看,是平凡普通的老旧格式的数据,POD是一个类型属性,既不是原创 2015-11-25 20:50:09 · 4896 阅读 · 1 评论 -
RTTI机制详解
引子以前我们探讨过,RTTI的访问和虚表相关,并且RTTI基本上是为了dynamic_cast<>和typeid以及异常而实现的。今天我们详细探讨下异常的实现机制。RTTI、虚表以及类的内存布局遵循的通常是Itanium C++ ABI,我不知道这个名字为什么会演化成现在这个样子,但是这个ABI标准是现今最流行的一个C++ABI标准。下面我们会精简地从中摘取出关于RTTI的相关内容。C++ABI中的原创 2015-12-14 19:10:08 · 2154 阅读 · 2 评论 -
C++中的Observer模式
引子什么时候Observer模式呢?对一个对象状态的更新,需要其他对象同步更新,而且其他对象的数量动态可变对象仅需要将自己的更新通知给其他对象而不需要知道其他对象细节许多时候,我们都需要当我们应用的一部分状态更新时,其他部分的状态能够相应的更新。有一种方式就是让接收者不断地去检查发送者的状态是否更新,这种方式有两种问题,首先会占用大量的CPU时间,然后就是接受者的状态不会立即的更新,总会有一定原创 2015-11-26 22:01:59 · 2114 阅读 · 0 评论 -
关于C/C++中内存分配与释放的疑惑?
关于C/C++中内存分配与释放的疑惑?在编写代码过程中,如果需要自己控制变量的生存周期或者栈空间不足以存放我们想要的数据时,我们就只能在堆上分配分配空间来管理我们的数据。在C/C++中,使用malloc/free和new/delete来创建和释放内存。当然手动管理内存永远是精巧危险但又有效率的做法,会存在内存泄露或者悬空指针的危险。指针在底层实现时,只是一个4字节的内存地址,附加在指针上的大小其实在原创 2015-07-26 11:07:26 · 1174 阅读 · 0 评论 -
C++中的"delete this"
引子C++中delete能否用于栈对象C++中”delete this”会出现什么问题C++中”delete this”有什么规避方法C++中delete能否用于栈对象在大家的印象中delete只能用于new出动态内存对象,我们使用了g++/Clang++/MSVC来测试delete栈对象的情况。测试代码如下:int main(){ int num = 10; int* p原创 2015-11-06 19:36:00 · 5429 阅读 · 0 评论 -
Name Mangling
引子为了在链接的时候能够让链接器唯一标识全局变量或者函数等的符号,编译器实现了一种name mangling的技术(也叫做name decoration),这个技术能够给所有目标文件中的符号一个唯一的名字。具体的实现方式就是编译器向函数,结构体,类或者其他的数据类型的对象名中附加上相应的类型信息,然后这个信息供链接器使用来实现链接过程中的符号决议。由于很多语言都允许对象同名,这些同名的对象或者处于不原创 2016-02-29 16:59:40 · 2639 阅读 · 0 评论 -
C++11中的 "enable_if"小记
std::enable_if原创 2016-06-18 16:27:06 · 18022 阅读 · 2 评论 -
inline - performance
引言函数内联(inline)算是C/C++很重要的语言特性,对于函数体比较小的函数来说 inline 可以说是一种比较重要的优化了。inline 在函数调用处(Call Site)使用函数体进行替换, inline 和 macro 很相似,但是又有一些不同,inline expansion 是在编译期间进行的,而 macro expansion 是在预处理阶段完成的。在编译期间可以获得类型等信息可以原创 2016-09-01 21:56:35 · 910 阅读 · 0 评论 -
dynamic_cast<>操作数必须是多态类型吗
dynamic_cast<>是C++运行时的一个类型转换运算符,通常用于自定义类型层次中的向下转型(downcasts),使用形式如下所示:dynamic_cast<type*>(e)dynamic_cast<type&>(e)dynamic_cast<type&&>(e)根据Primer中的解释,type必须是一个类类型,并且通常情况下该类型应该含有虚函数,即该类型是多态类型。也就是说有少原创 2015-11-03 21:13:25 · 5630 阅读 · 0 评论