![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++学习随记
文章平均质量分 89
qianji_little_boy
这个作者很懒,什么都没留下…
展开
-
什么是内存屏障?,为什么需要内存屏障?
原文链接1.什么是内存屏障?,为什么需要内存屏障?首先,为了性能编译器和处理器都会对指令进行重排序。什么是内存屏障:内存屏障是一条指令,该指令可以对编译器(软件)和处理器(硬件)的指令重排做出一定的限制,比如,一条内存屏障指令可以禁止编译器和处理器将其后面的指令移到内存屏障指令之前。为什么需要内存屏障:编译器和处理器指令重排只能保证在单线程执行下逻辑正确,在多个线程同时读写多个变量的情况下,如果不对指令重排作出一定限制,代码的执行结果会根据指令重排后的顺序产生不同的结果。指令重排后的顺序每次原创 2021-06-20 22:53:58 · 3203 阅读 · 0 评论 -
volatile关键字总结
volatile起源volatile是用来处理memory-mapped I/O(MMIO),带来的问题,在引入MMIO之后,一个内存地址既可能是真正的内存,也可能是被映射到一个I/O端口。相对于读写一个内存地址,即有可能是读写真正的内存,又有可能是读写的是一个I/O设备。考虑如下情形,int *p = some address;int a, b;a = *p;//读操作b = *p...原创 2019-09-11 09:44:47 · 147 阅读 · 0 评论 -
reinterpret_cast的一种用法
1.代码展示 // FreeList uses Node array to store Node* struct FreeList { typedef T* pointer; typedef pointer* ppointer; FreeList() = default; void push(pointer ptr) { ...原创 2019-08-28 17:26:40 · 280 阅读 · 0 评论 -
C++的右值引用
1. 语法 int& left_ref; int &&right_ref;2. 引入目的右值引用引入了两个语义,移动语义(move sementice)和精确传递(perfect forward).右值是即将销毁的对象,在某些场合例如拷贝的时候,我们想直接使用它的资源而重新申请资源。所以我们要区别对待左值和右值,实现函数重载,所以引入。精确传递是函数参数传递...原创 2019-08-02 13:24:05 · 158 阅读 · 0 评论 -
C++中static_cast、const_cast、reinterpret_cast和dynamaic_cast
1.static_cast主要使用场合当把一个较大的算术类型转化为一个较小的算术类型时,使用告诉编译器,我们不在乎精度损失,从而关闭编译器的警告 double d = 9.3; int i = d; //warning:可能丢失数据。有的编译器也不提示。 int i = static_cast<int>(d);//no warning对于编译器无法自动进行的类型转换...原创 2019-08-01 23:45:26 · 198 阅读 · 0 评论 -
C++程序_main函数之前与之后
一. main函数之前程序执行之前装载器会把环境变量和用户的命令行参数压入栈中。环境变量:系统的公用数据,例如系统搜索路径和当前OS版本等。初始化堆向系统申请内存,构建malloc的底层内存管理结构。初始化IO在用户空间建立stdin,stdout,stderr等对应的FILE结构,使得程序进入main函数之后就可以执行printf,scanf等函数。全局对...原创 2019-08-01 11:33:06 · 345 阅读 · 0 评论 -
function类模板
1.使用场合C++语言有多种可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用符的类。这些可调用对象具有不同的类型,可能具有相同的调用形式,有时候我们希望把它们看做具有相同的类型。eg:int add(int i, int j){ return i + j;}auto mod = [](int i, int j){ return i % j; }...原创 2019-08-04 17:29:01 · 311 阅读 · 0 评论 -
标准库bind函数
1.作用bind可以看做一个函数适配器,它接受一个可调用对象,生成一个新的可调用对象来适应原对象的参数列表。2.语法 auto newCallable = bind(callable, arg_list);arg_list是一个逗号分割的参数列表,对应给定的callable参数。当我们调用newCallable时,newCallable会调用callable并传递给它arg_list中的...原创 2019-08-04 16:59:13 · 173 阅读 · 0 评论 -
C++运行时类型设别(run-time type identification, RTTI)
1.dynamic_cast运算符作用将基类的指针、引用安全地转化为派生类的指针和引用。(下行转换)使用场合我们拿到了一个基类的指针或引用,我们想执行某个派生类的操作但是该操作不是虚函数。语法示例 Derived* dp = dynamic_cast<Derived*>(bp); //转换失败得到一个空指针 Derived& d = dynamic_cast&...原创 2019-08-04 15:55:16 · 174 阅读 · 0 评论 -
C++11 auto类型推断和decltype
1.auto类型推断a.引入原因编程时,经常需要将表达式的值赋给变量,这就要求我们在申明变量的时候,明确知道表达式的类型,然而要做到这一点并不容易,于是引入auto让编译器帮我们去做类型分析。b.使用注意事项 const int const_i = 1, &const_ref = const_i;auto在做类型推断时,顶层const被忽略掉。 auto b = cons...原创 2019-08-04 11:35:18 · 124 阅读 · 0 评论 -
C++ lambda表达式
1.引入原因我们可以对算法传递可调用对象,例如find_if,但是算法只能接受一元谓词或者二元谓词,但是有时候我们希望可调用对象的参数个数会超过算法的要求,这个时候我们可以使用lambda表达式的捕获列表来添加我们的参数。eg:find_if接受的是一元谓词,我们可以通过lambda的捕获列表多操作一个参数。如下代码,通过捕获列表,多操作了一个sz参数。 int sz = 5; vecto...原创 2019-08-02 23:22:37 · 81 阅读 · 0 评论 -
uva 1225题
Trung is bored with his mathematics homeworks. He takes a piece of chalk and starts writing a sequence of consecutive integers starting with 1 toN(1 < N < 10000) . After that, he counts the numb...转载 2018-08-16 23:36:42 · 180 阅读 · 0 评论 -
递归理解
https://blog.csdn.net/cy_93/article/details/50132449对递归的理解本层结束,返回上一层断点处继续执行,!!!!!!递归的基本法则:1.要有一个基准情形,不用递归就可以得到2.不断推进,递归的情况向着基准情形推进。...转载 2018-07-27 23:54:48 · 184 阅读 · 0 评论 -
(c++随笔) 堆和栈
点击打开链接堆和栈的区别转载 2018-07-10 18:53:40 · 100 阅读 · 0 评论 -
(c++随笔 )输入和输出;运算符的重载
friend std::istream & operator>>(std::istream & is, complex & c);std::istream & operator>>(std::istream & is,complex & c){ std::cout<<"real: "; is&原创 2018-07-10 16:44:27 · 168 阅读 · 0 评论