宝贝儿好
李园园
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++】移动语义、移动构造函数、std::move、移动赋值操作符、左值右值、左值引用右值引用
如果我们知道传入的是一个临时对象的话,我们就不需要担心它们是否活着、是否完整、是否拷贝,我们可以简单的偷用它的资源,给到特定的对象,或者在其他地方使用它们,因为我们知道它是暂时的,它不会存在很长时间,比如上面的ln+fn,就是暂时的,我们就可以从这个临时值中偷取资源,这对优化有很大帮助。左值是带地址的数据,就是有存储支持的变量。右值是临时值,可以用右值引用&&来检测。左值引用只能引用(接受)左值,除非加const,就也可以引用(接受)右值了。是有地址的值(located value),就是左值是有地址的。原创 2024-11-06 19:37:58 · 628 阅读 · 0 评论 -
【C++】C++的单例模式、跟踪内存分配的简单方法
这根本不是和某种对象有关的东西,它们只是C风格的函数,没有类,一点关系都没有。C++不像Java和C#那么多规则限制,C++不对静态函数做这些规则限制,所以C++可以不需要写一个类,可以在某个名称空间中写一些函数,甚至在全局名称空间中,它们不属于任何类的类型。特别是java,所有东西都必须是一个类,你不能在类之外有代码,如果你想要静态的功能,你不需要实例化,但你必须在你的类中创建静态成员。三是,C++可以有完全全局的变量,或者可以有一个静态变量,它被绑定到一个特定的翻译单元,或者一个特定的CPP文件。原创 2024-11-05 18:37:06 · 1078 阅读 · 0 评论 -
【C++】如何让C++字符串更快、C++的小字符串优化
std::string_view是C++17中的一个新类,它的本质是指向现有内存的指针,或者说就是一个const char指针,指向别人拥有的字符串,再加上一个大小size。也就是我创建了一个窗口,一个进入现有内存的小视图,而不是分配一个新的字符串。在C++17之前,人们就是这样做的,不是去创建一个自己的字符串,而是观察一个已有的字符串。如果程序中有很多字符串操作,比如格式化文本(日志记录),那是非常糟糕的,因为字符串操作是很慢的。说明:重载new操作符,返回malloc(size),这是基本的内存分配。原创 2024-11-03 23:48:17 · 767 阅读 · 0 评论 -
【C++】C++17结构化绑定、std::optional、std::variant、std::any
比如我们现在要写一个函数,这个函数的功能是读取一个文件,那这个文件是否存在?数据是否是我们期望的格式?此时这个函数的返回就是一个不确定的数据,可能有返回数据,也可能没有返回数据,也可能需要返回多个数据。所以函数的返回不是很确定的这种场景,就得用std::optional了。std::optional也是C++17标准中新引进的模板类类型,用于处理那些可能存在也可能不存在的数据。当读取不成功时,我们也不知道什么原因,是路径错了还是格式错了,还是路径格式都没错,只是文件里面确实就是没数据,所以啥也没读出来。原创 2024-10-31 16:46:48 · 719 阅读 · 0 评论 -
【C++】C++预编译头文件、基准测试benchmark
预编译头文件就是让我们提前先整理出一些头文件,比如C++库、标准模板库、windows api类的、这些几乎永远不会改变的、而且几乎都要用到的东西,都放到一个单独的头文件中(通常命名为pch.h或类似名称),然后让编译器提前我这些头文件编译成一个二进制文件(编译器通常默认的是生成.pch或.gch格式的),以二进制格式存储到磁盘。我们现在已经知道,开发一个项目,里面会有多个.cpp文件,编译这个项目时,先是对每个.cpp文件进行预处理,然后再编译,最后是将这多个文件合并成一个.exe文件。原创 2024-10-29 12:49:25 · 681 阅读 · 2 评论 -
【C++】Type punning类型双关、union联合体、C++中的类型转换casting
可见当你通过指针强制转换一个内存块后,再通过解引用指针去拷贝这个内存块到另外一个地方时,你拷贝的就是没有通过类型解析的纯纯的原始二进制字节流,而且拷贝的长度可能都有问题,因为你强制转化了类型了嘛,类型其中一个重要的信息就是这个数据的长度嘛,所以你长度可能都搞错了。上面的例子都是C++的最原始的内存操作,也正是有了这些任性自如的内存操作,使C++成为最为高效的编程语言。的,因为类型系统绝对是有其存在的理由的,你绕开类型系统,对这块内存随性操作,是非常容易引发很多潜在的风险和问题的。原创 2024-10-25 14:18:49 · 1267 阅读 · 0 评论 -
【C++】C++中的计时、多维数组、排序
在C++11标准之前,C++在语言层面是没有计时的。如果需要计时就得借助操作系统平台提供的API,比如windows的QueryPerformanceCounter。C++11标准出来后,C++11新标准提供了和日期时间相关的库:chrono标准库。这个库可以实现计时功能,而不必再去使用操作系统平台库。chrono标准库提供的是精度最高为纳秒级的计时接口。由于是C++标准库中提供的功能,所以可以很好地跨平台使用。计时的作用:希望某些事在特定时间发生;计时就是计算完成某个操作或执行某个代码所需要的时间。原创 2024-10-23 16:35:58 · 383 阅读 · 0 评论 -
【C++】C++中的线程
讲线程就是讲如何进行并行化。这又是一个巨大而晦涩的话题。我尽量往细了讲。原创 2024-10-22 12:23:51 · 1062 阅读 · 0 评论 -
【C++】函数指针、lambda表达式、名称空间
1、函数指针这里我们讲的是原始风格的函数指针(raw function pointer),也就是来自C语言的函数指针,但是这里将展示用C++的方式来使用函数指针。函数指针在【C++】深度理解C++数据类型:常量、变量、数组、字符串、指针、函数_c++ 字符串常量-CSDN博客 中的函数部分是有涉及到的,感兴趣的同学可以找找。函数指针是将一个函数赋值给一个变量的方法。所以函数指针的本质是一个指针,这个指针指向的是一个函数。使用函数指针,我们可以轻松的把函数赋值给变量,也可以把一个函数作为参数传递给其他函原创 2024-09-27 22:08:22 · 726 阅读 · 0 评论 -
【C++】C++中如何处理多返回值、C++中的模板、宏
上述例子中,两个字符串是程序进入main函数后,先开始运行func函数,而运行func函数就先组织参数,组织参数就是在常量区先写入"lyy""liyuanyuan"这两个字符串,然后才开始执行func,func又是在栈内存创建的,而执行func我们是通过引用传参的,这样就少了一次复制。写过python的同学都知道,当你写一个函数的返回时,那是你想返回谁就能返回谁,想返回几个就可以返回几个,几乎是非常的随心所欲了,因为python背后是做了很多很多事情才让你如此肆意的。func函数执行完毕,就是赋值给e。原创 2024-09-24 16:10:34 · 857 阅读 · 0 评论 -
【C++】C++库:如何链接外部库、静态链接和动态链接,以及如何自建库并使用
下载完毕后打开(上图5处),5处是C++库的典型组织结构,这里我们先简单介绍一下上图5处的文件:第一个文件夹docs:打开基本都是。原创 2024-09-20 09:18:23 · 2562 阅读 · 1 评论 -
【C++】静态数组array、动态数组vector创建及优化
C++给我们提供一个叫做Vector的类,这个Vector在std命名空间中。Vector不是向量的意思,更为准确的说是ArrayList,因为它的本质是一个动态数组。但与我们之前讲的数组类型不同的是,它可以调整数组的大小。意思就是当你创建一个vector时,它是没有固定大小的(当然你也可以初始化一个特定的大小,但一般我们不这样做),我们也不需要care它的大小,只要把元素放进去就行。每次你放入一个元素,数组的大小就会增长。原创 2024-09-13 15:18:48 · 1635 阅读 · 0 评论 -
【C++】理解C++中的复制、复制构造函数
也所以当代码执行到B处,先释放对象b时,就已经调用了析构函数删除了堆上的字符串数组了,再释放对象a时,又得调用析构函数,此时a中的p的值指向的堆内存已经被标记为free状态了,你再调析构函数free那块内存就没法free了,于是报了_UNKOWN_BLOCK。可见,不是任何时候我们都需要拷贝的,上例中的func函数,调用了3次,就拷贝了3次参数,调用完毕还得销毁,所以也销毁了3次。本篇先讲什么是copy,然后手写一个字符串复制的类,揭开拷贝的本质,就是拷贝都做了什么工作,并从中引出什么是浅拷贝、深拷贝。原创 2024-09-12 16:46:02 · 1388 阅读 · 0 评论 -
【C++】作用域指针、智能指针、共享指针、弱指针
因为虽然Entity是创建在堆内存上的,但是指向Entity的指针e可是创建在栈内存上的,e的作用域是它所在的花括号{},所以当{}指向完毕,e就销毁了,那指向Entity的指针都销毁了,就是相当于delete e;继续往下执行,就是22行的后花括号},就从第22行跳到第16行,再从第16行跳到第7行,第7行执行完毕后跳回第16行,执行16行,16行执行完毕后才跳回22行,算是22行执行完毕了,此时所有对象的值都没有了。作用域指针是一个类,是指针的包装器,在构造时用堆分配指针,然后在析构时删除指针。原创 2024-09-08 11:17:43 · 1225 阅读 · 0 评论 -
【C++】如何用C++创建对象,理解作用域、堆栈、内存分配
而堆是不同的,一旦你在堆中创建一个对象,这个对象就会一直在那里,直到你做出释放它的决定。但是上述在栈上创建的对象和在堆上创建的对象还是有差异的,差异就是小标题1中的四点。即使一个没有类成员的类,就是啥也没有的类,你实例化它创建的对象也是至少要占用1个字节的内存的。正常的情况下,一个类中是有很多类成员的,所以我们需要内存存放类实例的这一堆变量的值。第二个差异是:如果你的对象太大,或者对象太多,你最好也是把你的对象创建在堆上。从上图可见,不管在栈上创建类实例还是在堆上创建类实例,都自动默认的调用了构造函数。原创 2024-09-05 12:38:49 · 968 阅读 · 2 评论 -
【C++】类成员初始化列表、三元运算符、运算符及其重载、箭头操作符
也就是类成员初始化列表。就是我们在构造函数中初始化类成员(变量,有时也叫属性)的一种方式。见mutable关键字。原创 2024-09-03 16:15:42 · 461 阅读 · 0 评论 -
【C++】C++中的关键字:const、mutable、auto、typedef、using、new、delete、explicit、this、多文件放代码
const是一个限定修饰符,表示承诺某个对象不能改变,是强制开发人员写代码时的一个规则,也就是语法上的一个规则。但是如果这个类方法必须得改变类中的某些变量,而且它还想是个const方法时,就得用mutable关键字来修饰那个被改变得变量。小结:const用在类的方法中,一般都是这个方法声明不改变类的其他东西,就是读读,不修改的。在讲常量部分,有一个叫常变量的,就是就是用const限定一个常量,就变成常变量了。mutable是字面意思是可改变的,immutable是不可改变的、无法改变的。原创 2024-09-03 16:11:45 · 1126 阅读 · 0 评论 -
【C++】深度理解C++数据类型:常量、变量、数组、字符串、指针、函数
用array数组,虽然要增加点开销,但要方便很多,比如计算数组长度.size即可,还有像边界检查等我们都不需要考虑了。数组就是一个变量(数组)中有多个变量(各个元素)数组中的所有元素是连续放在某一块儿内存区域的。数组名就是这个数组在内存中的第一个元素的地址。原创 2024-06-29 17:15:49 · 981 阅读 · 0 评论 -
【C++】类、静态static、枚举、重载、多态、继承、重写、虚函数、纯需函数、虚析构函数
上面的Log类中的公共变量我用了两次public是因为:我喜欢把类中不同的部分分开来写,比如,public方法写在一部分,public变量又放另一部分,public静态变量又会放其他一部分。类外的函数访问类外的变量,肯定访问不了类内的变量了。说明:上面的步骤只是展示了如何逻辑清晰的写一个类,但事实上上面的代码是非常糟糕的,后面我们将使用更多的概念来改进这个类,使其达到专业生产级水平的代码。唯一的区别就是结构体中的变量默认都是共有的,类中的变量没有public声明就都默认是私有的。静态方法无法访问类的实例。原创 2024-06-26 12:33:27 · 1480 阅读 · 0 评论 -
【C++】一个极简但完整的C++程序
认真看过编译原理的同学就知道,变量名其实是给程序员看的,程序编译的时候,变量名直接被编译器映射成首地址和长度(长度是从变量的类型上看到的,比如上面的int类型)。某个书店将每本售出的图书的书名和出版社,输入到一个文件中,这些信息以书售出的时间顺序输入,每两周店主会手工计算每本书的销售量、以及每个出版社的销售量。(3a)按出版社排序 (3b)对每个出版社的书,按书名排序 (3c)在每个出版社组中,比较相邻的书名,如果二者匹配,增加第一个的数量,删除第二个。语句是C++中最小的程序单元。上述代码就是3条语句。原创 2024-06-21 00:09:54 · 2300 阅读 · 0 评论 -
【C++】循环、控制流语句、指针、引用
我们约定成俗是这样使用的:当我们确实是想无限持续循环的,比如游戏,就是想让一帧帧一直循环,我们不在意究竟循环了多少次,循环到哪里,就是不介意是否要去声明i,也不介意i究竟是多少了,就是想无限循环下去,那我们就使用while循环。如果条件是true,就执行循环体,一直执行到for循环的最后的花括号},跳回到for语句,此时首先执行的是i++,然后再判断条件,条件true就是上面的一套流程;如此循环,直到B不满足条件,也就是B返回false,指令指针跳出for循环,也就是执行E后面的代码行(第12行)。原创 2024-06-19 16:39:30 · 1054 阅读 · 0 评论 -
【C++】数据类型、函数、头文件、断点调试、输入输出、条件与分支、VS项目设置
但你自定义的类型都是在这些基本类型之上创建的。(7)数据转化为指针或引用。指针通过一个*号来声明,引用用&表示。说来话长,这些以后要专门聊。原创 2024-06-17 10:54:37 · 1257 阅读 · 1 评论 -
【C++】编译原理
三、C++编译前面给大家演示了如何从写C++代码到编译代码再到执行代码的全过程。这个过程中非常重要的编译环节,被我们一个按钮或者一个ctrl+F7快捷键就给带过了。其实这个环节非常重要,如果你非常了解这个环节,你开发源代码就会更加自信和清醒,而不是迷迷糊糊,摸棱两可……下图直观描述了从源代码到计算机执行完毕的各个大环节:内容实在多,图上没位置了,这里就继续说明上图。上图的1234是几个大步骤。1是我们的开发环境,你的代码就是在这个平台上书写、调试、编译、执行。。。等等上图2是我们在1中开发的原创 2024-06-12 22:01:58 · 1816 阅读 · 0 评论 -
【C++】环境搭建及基本工作流程
就是.exe文件,而这个过程就要用到上图的链接Linker,就是把所有的.obj文件link到一起,形成一个.exe文件。点击上面的绿色空心三角,是编译并执行的意思,就出现下面的output及Debug Console,这一步我们只是写源文件代码,所以你可以先不点击这个三角。以上就是编译的基本流程,其实也就是个大概的整体过程,如果需要深度理解每一个细节的话,还得看一些编译和链接方面的更深的细节东西。说明:上面的编译过程是仅仅编译了一个Main.cpp一个文件的过程,所以这个过程是不会进行链接Link的。原创 2024-06-10 00:31:49 · 1663 阅读 · 0 评论
分享