c++基础与进阶
复习c++语法与特性时的记录,旨在记录重要的细节
不适合新手学习,适合细节复习以及应对面试
coding丁
中山大学,
math and computer
保持谦卑,保持自信,充满动力,充满野心
展开
-
一文搞定c++多线程同步机制
c++多线程同步机制同步与互斥现代操作系统都是多任务操作系统,通常同一时刻有大量可执行实体,则运行着的大量任务可能需要访问或使用同一资源,或者说这些任务之间具有依赖性。线程同步:线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。例如:两个线程A和B在运行过程中协同步调,按预定的先后次序运行,比如 A 任务的运行依赖于 B 任务产生的数据。线程互斥:线程互斥是指对于共享的操作系统资源,在各线程访问时具有排它性。原创 2020-09-08 21:02:05 · 15178 阅读 · 3 评论 -
一文搞定c++多线程
一文搞定c++多线程c++11引入了用于多线程操作的thread类,该库移植性更高,并且使得写多线程变得简洁了一些。多线程头文件支持为了支持多线程操作,c++11新标准引入了一些头文件来支持多线程编程:<thread>:内部声明了 std::thread 类,用于创建多线程<atomic>:内部声明std::atomic 和 std::atomic_flag两个类,可以利用这两个类实现原子类型的各种特性,并且声明了一些原子操作函数<mutex>:提供了多种互原创 2020-09-07 23:59:58 · 3009 阅读 · 0 评论 -
一文搞定移动语义和完美转发
一文搞定移动语义和完美转发浅拷贝和深拷贝简单的区分: 浅拷贝:按字节拷贝,如果是指针变量则直接对指针地址进行拷贝 深拷贝:对内容进行拷贝,如果有指针变量则另外申请地址拷贝所指内容写c++类时,如果类中有指针成员的话,通常我们都会格外注意,要注意拷贝构造函数的编写,因为如果简单的浅拷贝可能导致free一块未定义区域,是非法的。如下面的程序:#include<iostream>using namespace std;class HasPtrMem{public: Ha原创 2020-08-21 10:51:01 · 901 阅读 · 1 评论 -
编译到底是在干什么
编译到底是在干什么写c++都知道,写完程序要编译才能形成可执行文件,那么,编译到底是在干一件什么样的事呢?编译的例子写一个简单的helloworld.cpp程序#include<iostream>using namespace std;int main(){ cout<<"hello world!\n";}然后执行g++进行编译并运行:[root@VM-238-167-centos /]# g++ -o helloworld helloworld原创 2020-08-02 17:15:52 · 5046 阅读 · 1 评论 -
Linux下检测程序内存泄漏
Linux下检测程序内存泄漏工具:valgrindLinux下载方式:yum install valgrind内存泄漏:程序在heap上分配了内存却没有释放写一个c语言内存泄漏程序:#include <stdlib.h>void f(){ int *t=malloc(sizeof(int)*10);}int main(){ int *array = malloc(10*sizeof(int)); f(); return 0;} 很简单的一个程原创 2020-07-24 15:42:11 · 687 阅读 · 0 评论 -
C++深入学习:STL源码剖析 (3) 从源码深入剖析list
C++深入学习:STL源码剖析 (3) 从源码深入剖析listvector和list是最常用的容器,vector是连续的线性空间,list则是非连续的用指针串联起的空间。因此list对于空间的利用是非常充分的,对于任意位置的插入删除操作,list是常数时间完成。list不仅是双向链表,而且是环形双向链表,因此只需要一个指针便可以实现对整个list的迭代器的标记。为了符合STL的前闭后开的区间要求,list实现时将该指针节点指向一个置于尾端的空白节点,则该节点的前面是尾结点,该节点的后面是头结点,根据此原创 2020-06-23 17:12:29 · 330 阅读 · 0 评论 -
C++深入学习:STL源码剖析 (2) 从源码深入剖析vector
C++深入学习:STL源码剖析 (2) 从源码深入剖析vector vector的使用就像数组,但是vector的空间是可变的。vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。vector的实现技术,关键就在于对大小的控制以及重新配置时的数据移动效率。需要注意的是,对于空间的扩充,是(配置新空间->数据移动->释放旧空间)的大工程,时间成本是较高的,因此如果每次需要扩充仅仅只扩充所需的,则会导致频繁的扩充,因此vector采用了未雨绸缪的考虑。学习vect原创 2020-06-22 09:42:07 · 268 阅读 · 0 评论 -
C++深入学习:STL源码剖析 (1) {STL、迭代器、前闭后开}
C++深入学习:STL源码剖析 (1) {STL、迭代器、前闭后开}STL六大组件容器(containers):各种数据结构:如vector,map,list,deque,set等算法(algorithm):各种常用算法:如sort,max,min,search,copy等迭代器(iterators):扮演容器与算法的胶合剂,泛型指针仿函数:实现角度可以认为是重载了operator()的class配接器:用来修饰容器或仿函数或迭代器接口配置器:负责空间配置管理前闭后开区间表示法 [)任原创 2020-06-20 11:04:51 · 575 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (9) {enum new union extern}
C++基础知识面试必备、复习细节 (9) {enum new union extern}new和deletenew表达式三步操作:new调用一个名为operator new(或operator new[])的标准库函数,该函数分配一块足够大的、原始的、未命名的内存空间以便存储特定类型的对象(或者对象的数组)编译器运行相应的构造函数以构造这些对象,并传入初值对方被分配空间并构造完成后,返回一个指向该对象的指针delete表达式两步操作:对所指的对象或者所指的对象数组中的元素执行对应的析原创 2020-06-19 14:06:51 · 204 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (8)(tuple、随机数、异常处理、多继承)
C++基础知识面试必备、复习细节 (8)(tuple、随机数、异常处理、多继承)tuple类型tuple是一个类似于pair的模板,pair类型是每个成员变量各自可以是任意类型,但是只能有两个成员,而tuple与pair不同的是它可以有任意数量的成员个人常把tuple当作一个结构体使用,如果只是一次使用的话就避免了结构体繁琐的创建tuple的基本操作:tuple<int,string,int> t{1,"James",1000}; //可以用来存一个序号,名字,工资这样的信原创 2020-06-19 10:41:59 · 208 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (7) (关联容器、动态内存)
C++基础知识面试必备、复习细节 (7) (关联容器、动态内存)pair类型pair保存两个数据成员,通常用来存储具有一定关系的二元组pair<int,string> t; //保存一个int和一个stringpair<int,vector<int>> m; //保存一个int和一个vector<int>t=make_pair(i,str); //t的值为 <i,str>cout<<t.first<<原创 2020-06-18 11:28:17 · 199 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (6) (容器、lambda函数)
C++基础知识面试必备、复习细节 (6)常见的顺序容器顺序容器类型特点vector可变大小的数组。支持快速随机访问。在尾部之外的位置插入或删除元素代价较高list双向链表。支持双向顺序访问。任意位置的插入删除都效率较高,不支持快速访问forward_list单向链表。支持单向顺序访问,任意位置插入删除效率较高。string可变大小的保存字符的容器。支持快速随机访问。尾部插入删除速度快array固定大小数组。支持快速随机访问。不能添加或删除元素d原创 2020-06-17 23:23:27 · 241 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (5) {Effective c++}
C++基础知识面试必备、复习细节 (5) {Effective c++}尽可能延后变量定义式的时间尽可能推迟定义变量,只有在真正要使用的时候再定义,最好在需要初始化时定义,即定义时就立刻初始化。尽量少做转型动作尽量避免使用cast,必须使用cast的情况下,应尽量将cast置于函数内部避免返回一个指针、引用或者迭代器指向类内的成员原因是如果返回了成员的引用或者指针,就可以通过这个引用或者指针修改类内的private成员努力处理异常当异常被抛出时,要做到不泄露任何资源,不允许数据败坏。inl原创 2020-05-31 22:01:27 · 300 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (4){Effective c++}
C++基础知识面试必备、复习细节 (4) {Effective c++}尽量以const,enum,inline替换#defineconst double Ratio=1.65; //用该方式定义常量#define Ratio 1.65; //尽量不要以define方式定义常量//在类中,也可以用enum替换defineclass GamePlayer{ enum{NumTurns=5}; //NumTurns就成为5的一个记号 int scores[NumTurns];原创 2020-05-31 10:19:31 · 451 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (3)
C++基础知识面试必备、复习细节 (3)vector扩容原理说明新增元素:Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 ;初始时刻vector的capacity为0,塞入第一个元素后capacity增加为1;不同的编译器实现的扩容方式不一样,VS2015中以1.5倍扩容,GCC以2倍扩容。c++类型原创 2020-05-29 22:32:52 · 822 阅读 · 3 评论 -
C++基础知识面试必备、复习细节 (2)
C++基础知识面试必备、复习细节 (2)类基础知识c语言强调面向过程,c++强调面向对象定义public说明符之后的成员在整个程序内可被访问;定义private说明符之后的成员只可以被类的成员函数访问,即隐藏了实现细节;定义protected说明符则说明该类或该类的子类、友元可以访问使用struct和class定义类的唯一区别在于默认的访问权限不一样,struct的默认访问权限为public,class的默认访问权限为private封装的优点:确保用户代码不会无意破坏封装对象的状态,且被封装类的原创 2020-05-29 11:57:35 · 327 阅读 · 0 评论 -
C++基础知识面试必备、复习细节 (1)
c++变量与基本类型 (细节)(解决面试时常问的考点以及易忘点易混点)一些经验准则:如果明确数值不为负,则选择无符号类型使用int执行整数运算(如果超出int数值范围则采用 long long)执行浮点数运算采用double(注意double类型不可以用==判断相等,可以用相差值小于一个很小的值判断)类型转换时要注意范围,浮点转换到整型会损失小数部分切勿混用带符号和无符号类型。(当无符号和有符号相加时,带符号数会转变为无符号数,会引发错误)定义变量时尽量初始化,尤其在函数体内,因为在函数体原创 2020-05-26 15:18:01 · 510 阅读 · 0 评论