
程序员应知应会
文章平均质量分 82
so~what
这个作者很懒,什么都没留下…
展开
-
C++程序员应了解的那些事(117)~进程、线程、协程
并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。4)如果处理机正在处理第i队列中某进程,又有新进程进入优先权较高的队列,则此新队列抢占正在运行的处理机,并把正在运行的进程放在第i队列的队尾。一个进程可由多个线程的执行单元组成,每个线程都运行在同一进程的上下文中,共享同样的代码和全局数据。在优先权越高的队列中,为每个进程所规定的执行时间片就越小。原创 2023-08-22 22:12:54 · 819 阅读 · 0 评论 -
C++程序员应了解的那些事(116)~单引号 VS 双引号
单引号 VS 双引号原创 2023-04-09 14:36:19 · 3482 阅读 · 1 评论 -
C++程序员应了解的那些事(115)~类模板的分离式编译(类模板究竟要不要接口与实现分离)
C++类模板声明与实现分离原创 2023-04-03 22:50:21 · 520 阅读 · 0 评论 -
C++程序员应了解的那些事(115)~智能指针的死穴:循环引用
C++最新标准C++11中已将基于引用计数的智能指针share_prt收入囊中,智能指针的使用门槛越来越低,不需要使用boost库,我们也能轻松享受智能指针给我们带来的方便。智能指针,正如它的名字一样,似乎是个近乎完美的聪明角色,程序员不用再纠结于new出来的内存在哪释放比较合适这种问题。比如当一个资源被多个模块共享时,程序员需要在所有模块的生命周期都结束时,由最后一个不使用该指针的模块触发指...原创 2020-04-17 20:47:22 · 245 阅读 · 2 评论 -
C++程序员应了解的那些事(114)~Effective C++ :改善程序与设计的55个具体做法
参考博客:原创 2023-03-25 16:21:57 · 1197 阅读 · 0 评论 -
程序员应了解的那些事(112)~原子操作
原子操作原创 2022-12-22 19:54:15 · 1024 阅读 · 1 评论 -
程序员应了解的那些事(111)~进程、线程及堆栈关系
进程、线程及堆栈关系原创 2022-09-03 23:15:00 · 3140 阅读 · 3 评论 -
C++程序员应了解的那些事(110)类的静态成员变量与静态成员函数
类的静态成员变量与静态成员函数原创 2022-08-20 14:22:45 · 284 阅读 · 0 评论 -
程序员应了解的那些事(109)C++的局部类
C++的局部类原创 2022-08-20 13:40:07 · 1418 阅读 · 0 评论 -
程序员应了解的那些事(108)C++对象模型:效率有了,弹性呢?
动态共享函数库 (Dynamic Shared Libraries)原创 2022-07-04 21:43:48 · 1875 阅读 · 0 评论 -
程序员应了解的那些事(107)之图灵完备
图灵完备原创 2022-06-29 23:30:03 · 3105 阅读 · 0 评论 -
C++程序员应了解的那些事(106)之C++ STL中的vector的内存分配与释放
(1)vector的内存增长 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,都需要重新分配空间、拷贝元素、撤销旧空间,这样性能难以接受。因此STL实现者在对vector进行内存分配时,其实际分配的容量要比当前所需的空间多一些。就是说vector容器预留了一些额外的存储区,用于存放新添加的元素,这...原创 2021-04-12 23:09:52 · 363 阅读 · 0 评论 -
C++程序员应了解的那些事(105)之const相关
目录一、const含义二、const作用(1)可以定义常量 const int a=100;(2)类型检查(3)防止修改,起保护作用,增加程序健壮性(4)可以节省空间,避免不必要的内存分配三、const对象默认为文件局部变量四、指针与const(1)指向常量的指针(2)常指针五、函数中使用constcost修饰函数返回值六、类中使用const一、const含义 常类型是指使用类型修饰符const说明的类型,常类型的...原创 2021-04-01 23:32:49 · 358 阅读 · 0 评论 -
C++程序员应了解的那些事(104)~ 动态库与静态库 动态链接与静态链接
(1)动态链接与静态链接动态链接: 是指一个项目A链接了一个动态链接库的项目B(项目B编译后生成的是DLL以及lib文件)。项目A只需要将lib文件引入到本项目中即可,无论是通过项目配置或者#prgram comment(lib,"B.lib")还是其他什么方式,那都是动态链接,程序A运行时是必须要B.DLL这个动态链接库的,否则运行报错。(对于动态库而言lib仅仅只是B项目功能的索引,不具备具体的功能,功能代码全在DLL中,所以lib仅在编译时使用,DLL仅在运行时使用)静态链接:...原创 2021-03-30 22:41:05 · 321 阅读 · 0 评论 -
C++程序员应了解的那些事(103)发生死锁必须满足四个条件:互斥条件/请求与保持条件/不剥夺条件/循环等待条件
要想发生死锁有 4 个缺一不可的必要条件:第 1 个叫互斥条件,它的意思是每个资源每次只能被一个线程(或进程,下同)使用,为什么资源不能同时被多个线程或进程使用呢?这是因为如果每个人都可以拿到想要的资源,那就不需要等待,所以是不可能发生死锁的。第 2 个是请求与保持条件,它是指当一个线程因请求资源而阻塞时,则需对已获得的资源保持不放。如果在请求资源时阻塞了,并且会自动释放手中资源(例如锁)的话,那别人自然就能拿到我刚才释放的资源,也就不会形成死锁。第 3 个是不剥夺条件,它是指线程已获得的资源,原创 2021-03-30 22:21:51 · 2942 阅读 · 1 评论 -
C++程序员应了解的那些事(102)~ C中snprintf与vsnprintf函数
虽然snprintf函数在开发过程中比较常用,但是其中有一些细节性的问题需要注意。因为snprintf函数不是C中的标准函数,不同的编译器可能对该函数的实现不同,本文说明是基于GCC编译器。1、snprintf函数1.1 函数原型snprintf函数的作用是将格式化的数据写入字符串。其函数原型如下:snprintf(char* buffer, int n, char* format, ...);1.2 参数说明buffer : 存储格式化字符串的buffer n :...原创 2021-02-07 23:08:52 · 519 阅读 · 1 评论 -
C++程序员应了解的那些事(113)关于C++异常
本文是作者翻译过C++之父Bjarne Stroustrup的技术文章C++核心准则中有关C++中异常的文章之后的总结:异常处理机制希望解决的问题:为了使用错误处理系统化,健壮和不繁琐。例如下面的代码:void f2(int i) // Clumsy and error-prone: explicit release{ int* p = new int[12]; // ... if (i < 17) { delete[] p; t原创 2021-01-23 21:16:43 · 178 阅读 · 0 评论 -
C++程序员应了解的那些事(99)之 C++中的ODR法则
C++ 标准规定“每个程序应该只包含那个程序中用到的每个非内联函数或对象的一个定义”。然而在同一个程序中,一个类、枚举类型、具有内部链接的内联函数和和一 个模板可能有不止一个定义——只要每个定义出现在一个独立的翻译单元即可。对于内联函数和模板的情况,常用做法是在头文件中编写它们的定义,然后在每个独 立编译的源文件中使用 #include 引入它。定义的同等性 这就引出一个问题:什么时候两个定义完全相同?单定义规则 (ODR,One Definition Rule)定义了...原创 2021-01-25 22:35:42 · 1177 阅读 · 0 评论 -
C++程序员应了解的那些事(98)C++构造函数小结
首先来看代码:class ba{public: int b;};ba object = {10}; 上面这代码能编译通过,怎么没有构造函数?object是怎么回事? 上面这代码其实是具备结构体性质的C++类,要不然我们怎么说C/C++,为了理解,所以这样说,但也没说错。既然是结构体了,那么下面的初始化也就明白了。但是,这样的初始化方式只能初始化public成员,而私有和保护的却不能这样初始化,因为权限问题。(这个需要自己理解了) ...原创 2021-01-20 22:14:00 · 210 阅读 · 2 评论 -
C++程序员应了解的那些事(97)C++中的string类型占用多少个字节
偶然间碰到一个一个问题,问题大概是这样子的:C++中一个std::string 变量中包含1万个字符,如果sizeof这个变量,会得这个变量占有多少个字节;于是在网上搜集资料进行验证:代码如下#include<iostream>#include<string>int main(){ std::string str_test1; std::string str_test2 = "Hello Word"; int value1, va...原创 2021-01-19 22:16:13 · 1666 阅读 · 0 评论 -
C++程序员应了解的那些事(96) C++模板使用集锦~模板何时被实例化<95续>
导入: 今天编程时碰到一个问题,写了一个单例的类模板,之前程序一直能跑,但今天使用了其中一个函数时却报错。后来发现是自己忘记写结束符号了。这就引出我知识点的不足了:之前为啥能跑正常?错误一只存在,为啥总是能编译通过?类中的函数何时才被实例化?类何时实例化?实例化的类是不是所有的函数都同时被实例化? 在我们使用类模板时,只有当代码中使用了类模板的一个实例的名字,而且上下文环境要求必须存在类的定义时,这个类模板才被实例化。声明一个类模板的指针和引用,不会引起类模板的实例化,...原创 2021-01-18 22:01:06 · 223 阅读 · 0 评论 -
C++程序员应了解的那些事(95)C++模板使用集锦
【1】C++函数模板的隐式实例化、显式实例化与显式具体化:统称具体化一、什么是实例化和具体化? 为进一步了解模板,必须理解术语实例化和具体化。(1)实例化:在程序中的函数模板本身并不会生成函数定义,它只是一个用于生成函数定义的方案。编译器使用模板为特定类型生成函数定义时,得到的是模板实例。这即是函数模板的实例化! 而函数模板实例化又分为两种类型:隐式实例化和显式实例化。<示例>template < typename T >void...原创 2021-01-12 22:51:18 · 145 阅读 · 0 评论 -
C++程序员应了解的那些事(94)之STL容器内存释放问题
容器的空间申请和基本函数操作,以及algorithm等都比较好理解,用起来也很方便,比较关键的是容器元素包含指针时,空间的申请和释放问题,这个觉得STL做得挺乱的。总结了几点注意的。(1)自己new的空间,在释放的时候必须先delete,然后再释放容器。例如list<char*>MS,链表中存的是自己的动态字符串,如果字符串是自己动态申请的,则在释放该链表的时候,需要先delete[](*curIter),然后再MS.erase(curIter),其中curIter是当前迭...原创 2021-01-08 22:15:24 · 2315 阅读 · 0 评论 -
C++程序员应了解的那些事(93)之odr-used 是什么
简而言之变量的odr-use就是常量折叠(constantfolding)的补集。Avariablexwhosenameappearsasapotentially-evaluatedexpressionexisodr-usedbyexunlessapplyingthelvalue-to-rvalueconversion([conv.lval])toxyieldsaconstantexpression([expr.const])thatdoes...原创 2021-01-08 21:46:49 · 1241 阅读 · 3 评论 -
C++程序员应了解的那些事(91)C++容器之swap()函数的几点说明
https://blog.youkuaiyun.com/qq_43152052/article/details/95793892原创 2021-01-06 22:43:49 · 625 阅读 · 0 评论 -
C++程序员应了解的那些事(89)C++ STL中sort()排序
<1>所有sort算法介绍(只支持随机访问迭代器!) 所有的sort算法的参数都需要输入一个范围,[begin, end)。这里使用的迭代器(iterator)都需是随机迭代器(RadomAccessIterator), 也就是说可以随机访问的迭代器!如果你需要自己定义比较函数,你可以把你定义好的仿函数(functor)作为参数传入。每种算法都支持传入比较函数。 以下是所有STL sort算法函数的名字列表:函数名 功能描述 sort 对给...原创 2021-01-06 21:19:23 · 297 阅读 · 0 评论 -
C++程序员应了解的那些事:C++ 核心准则之 ~ Templates and generic programming
C++核心准则T.1:使用模板提高代码的抽象水平T.1: Use templates to raise the level of abstraction of codeT.1:使用模板提高代码的抽象水平Reason(原因)Generality. Reuse. Efficiency. Encourages consistent definition of user types.普遍性。重用。效率。鼓励用户类型的一致性。Example, bad(反面示例)Conceptually, the follo原创 2020-12-30 23:25:35 · 142 阅读 · 0 评论 -
C++程序员应了解的那些事:C++ 核心准则之 ~ Classes and class hierarchies
<原链接>https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c83-for-value-like-types-consider-providing-a-noexcept-swap-function原创 2020-12-28 22:08:28 · 290 阅读 · 0 评论 -
C++程序员应了解的那些事(88)之 变参模板
一、变参模板概述 变参模板(variadictemplate)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数、任意类型的参数。相比C++98/03,类模版和函数模版中只能含固定数量的模版参数,可变模版参数无疑是一个巨大的改进。然而由于可变模版参数比较抽象,使用起来需要一定的技巧,掌握也存在一定的难度。二、可变模版参数的展开 可变模板参数和普通模板参数的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或clas...原创 2020-12-23 20:25:56 · 1354 阅读 · 2 评论 -
C++程序员应了解的那些事:C++ 核心准则之 ~ Enum篇
C++核心准则Enum.1:枚举类型比宏定义好Enum.1:PreferenumerationsovermacrosEnum.1:枚举类型比宏定义好Reason(原因):Macrosdonotobeyscopeandtyperules.Also,macronamesareremovedduringpreprocessingandsousuallydon'tappearintoolslikedebuggers.宏定义不需要遵守范围和...原创 2020-12-22 22:04:02 · 578 阅读 · 0 评论 -
C++程序员应了解的那些事(87)~ C++11新特性之enum前置声明
目录大型开发都会遇到的问题:不必要的头文件依赖前置声明:enum前置声明:大型开发都会遇到的问题:不必要的头文件依赖随着软件规模的扩大,包含在一个工程中的模块的数量在不断增长,模块之间的依赖关系也日益复杂。这里只举一个相对简单的例子:一个包含2个类,5个文件的工程。ImportantClass.h头文件中声明了构造函数,doWork成员函数和数据成员buffer。ImportantClass.cppcpp文件中为构造函数和doWork提供了最简单的实现。.原创 2020-12-22 21:55:50 · 623 阅读 · 0 评论 -
C++程序员应了解的那些事(86)类模板特例化之~ 模板特化要与对应的模板放在同一个命名空间下
【标准库hash模板示例】 为标准库hash模板定义一个特例化版本,可以用它来将Sales_data对象保存在无序容器中。默认情况下,无序容器使用hash<key_type>来组织元素,为了让我们自己的数据类型Sales_data也能使用这种默认组织方式,必须定义hash模板的一个特例化模板。 一个特例化hash类必须定义:(1) ※! 一个重载的调用运算符,它接受一个容器关键字类型的对象,返回一个size_t(2) 两个类型成员,result_type和...原创 2020-12-16 20:58:50 · 328 阅读 · 0 评论 -
C++程序员应了解的那些事(85)C++空引用”与“空指针”的区别
网络上有很多讨论C++的“引用”与“指针“的区别的文章,谈到区别,其中有一条:“引用不能为空(NULL),引用必须与合法的存储单元关联,指针则可以是NULL”,但在实际应用中,有时候为了保持一致性,我们会抛开这个规则,人为创造出一个“空引用”。 很多情况下,“空引用”确实可以工作,以致于“引用不能为空”的忠告,被嘲笑为形式主义,仅仅是标准制定者的耸人听闻。一个“空引用”的例子是:int * a = NULL;int & b = *a; 于是当访...原创 2020-12-10 21:33:03 · 579 阅读 · 0 评论 -
C++程序员应了解的那些事(84)关于if “区间性判断语句的大坑”
走读以下示例代码:#include <iostream>using namespace std;int main(){ int a; cin>>a; if(a<-100) cout<<"a<-100"<<endl; else if(-100<=a<=5) cout<<"-100<=a<5"<<endl; else cout<<"a>=5"<..原创 2020-12-10 21:08:33 · 1155 阅读 · 0 评论 -
C++程序员应了解的那些事:C++ 之父 Stroustrup 推出“ C++ 核心准则”
2015年的 C++ 大会 9月20-25日在美国华盛顿州的 Bellevue 举行。C++ 之父 Bjarne Stroustrup(本贾尼·斯特劳斯特卢普) 在本次大会的主题演讲上,宣布了C++ 的核心准则(C++ Core Guidelines)。这份准则旨在帮助程序员更加高效地使用现代的 C++("现代 C++" 指 C++11 和 C++14 以及未来的 C++17),英文文档已提供在这个项目的GitHub repository:```遵循这些原则,会让你的代码静态类型安全、...原创 2020-12-09 22:51:05 · 802 阅读 · 3 评论 -
C++程序员应了解的那些事(83)c++ set / unordered_set
目录【set 与 unordered_set区别: 导入】【unordered_set使用举例 +hash模板函数特化】【unordered_set 只提供单向迭代器 + insert/find/erase用法(平均圈复杂度1)】【STL里面的五种迭代器】【unordered_set原型及基本操作】【set 与 unordered_set区别: 导入】 c++std中set与unordered_set区别和map与unordered_map区别类似: ...原创 2020-12-09 21:23:31 · 1235 阅读 · 0 评论 -
C++程序员应了解的那些事(82)~extern使用小结
<1>全局变量在外部使用声明时,extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此标记存储空间在执行时加载如内存并初始化为0。 <2>而局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存。 <3> 全局变量或函数本质上讲没有区别,函数名是指向函数二进制块开头处的指针。而全局变量是在函数外部声明的变量。函数名也在函...原创 2020-12-08 22:21:55 · 488 阅读 · 0 评论 -
C++程序员应了解的那些事(81) concept for C++20
C++20概念(concepts)入门conceptforC++20用法简介原创 2020-12-07 22:06:23 · 312 阅读 · 0 评论 -
C++程序员应了解的那些事(80)鸭子类型~duck typing~
鸭子类型(ducktyping): 在程序设计中,鸭子类型(ducktyping)是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。 这个概念的名字来源于由JamesWhitcombRiley提出的鸭子测试,“鸭子测试”可以这样表述: 当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。 在鸭子类型中,关注的不是对象的类型本...原创 2020-12-07 21:59:40 · 1053 阅读 · 0 评论 -
C++程序员应了解的那些事(79)完美转发 std::forward()
【移动语义std::move】 其实对于std::move来说,它做的事情大致如下(当然真正的实现并非如此):template<typename T>T&& move(T& val){ return static_cast<T&&>(val);}move 只是纯粹的将一个左值转化为了一个右值,STL实现基本都已经实现了移动语义,相当于对于vector<T>::push_back()有两个版本的实现,...原创 2020-12-05 22:50:39 · 240 阅读 · 1 评论