- 博客(51)
- 收藏
- 关注
原创 C++学习笔记(五十):c++ 移动语义与std::move
可以看到执行了两次内存分配,一次是在Created中,一次是在Copityed中,因为String("pcop")先创建了一个String对象,然后通过引用的方式传递给Entity,Entity调用复制构造函数,在复制构造函数中新建一个String对象m_Data。本节介绍c++的移动语义与新特性std::move,本节介绍的内容主要用在性能优化上。c++移动语义和c++左值右值的内容相关联,可以先看之前发的左值右值内容。
2024-01-25 15:04:21
776
原创 C++学习笔记(四十九):c++ 左值右值
本节介绍c++左值和右值的相关知识。网上有很多种关于左值右值的定义,例如左值是有内存地址的,右值没有等等。我们可以不去坚持找到明确的定义,我们仅需要知道左值和右值是什么即可。
2024-01-23 09:33:42
474
原创 C++学习笔记(四十八):c++ 单例模式
本节介绍c++单例模式。单例模式顾名思义,就是所有实例的内存地址都相同,也就是类仅有一个实例对象。c++中的单例只是一种组织一堆全局变量和静态函数的方法。接下来通过代码来展示单例模式的实现。
2024-01-22 18:45:03
421
原创 C++学习笔记(四十七):c++ 字符串优化
用string_view来替换substr,string_view是通过内存试图来操作,简单说就是还在在原来的内存进行操作,取指定内存位置的值。string_view是c++17中的特性。本节介绍c++字符串优化的相关知识。c++中string对性能的影响比较大,因为string的很多操作都需要重新分配内存,进而影响程序性能。接下来通过代码来展示优化的小技巧。
2024-01-22 17:04:25
485
原创 C++学习笔记(四十六):c++ 多线程
本节介绍c++多线程相关的知识。使用多线程,主要是为了提高程序的并行度,进而提高程序的性能。以下通过事例简单介绍future相关的知识。并发支持库 - cppreference.com。
2024-01-22 16:18:56
451
原创 C++学习笔记(四十五):c++ any单一变量存储任意类型数据
本节介绍c++单一变量存放任意类型数据的方式,是通过c++17新特性std::any来实现。
2024-01-17 15:44:54
468
原创 C++学习笔记(四十四):c++ variant单一变量存放多种数据类型
本节介绍的也是c++17中的新特性variant,用来处理单一变量存放多种数据类型。大致意思是我们不用关心变量的具体类型,在之后用的术后在考虑变量的具体类型。和联合体不同的是,联合体的内存大小是所有成员中最大的内存大小,而variant则表示当前所有类型加起来的大小。
2024-01-17 15:16:40
492
原创 C++学习笔记(四十三):c++ optional
本节介绍的是c++17中另一个新特性optional,用来处理可能存在也可能不存在的数据。接下来通过代码来展示该新特性。上述程序返回结果是“打开文件成功”,data.value()返回的是空字符串。
2024-01-17 14:57:11
510
原创 C++学习笔记(四十一):c++ 性能测试
本节介绍c++的基准测试,主要是在Windows环境下进行测试。有几种性能分析的方法,第三方工具、计时器等。
2024-01-17 14:02:15
403
原创 C++学习笔记(三十九):c++ 类型转换
本节介绍c++类型转换的相关知识。c++是强类型语言,存在一个类型系统用来将一种类型的数据强制转换成另一种类型。一般有两种方式进行强制类型转换。reinterpret_cast:和类型双关类似,将一段内存解释成别的类型。上述四种类型转换均提供编译时检查功能,使用起来更加安全。const_cast:移除或添加变量的const限定。dynamic_cast:动态类型转换。static_cast:静态类型转换。
2024-01-16 21:28:21
377
原创 C++学习笔记(三十八):c++ 联合体
本节介绍c++联合体union。一个联合体只能有一个成员,例如我们声明4个float变量,但联合体的大小仍为4字节,这4个float的内存是一样的。可以像结构体一样使用联合体,可以添加静态函数或者普通函数方法等。一般使用联合体和类型双关相关联。类型双关是指将同一块内存的数据类型转换成其他数据类型。float b = (float),此处仅仅举例。当想给同一个变量取不同的名字是,联合体的作用就体现出来了。例如一个结构体Vector3(x,y,y),既想当作向量,又想当作三原色RGB。
2024-01-15 21:22:06
598
原创 C++学习笔记(三十七):c++ 计时
本节介绍c++中计时,计时在程序流程控制和性能测试中有着非常重要的作用。更进一步的计时函数,创建一个简单的定时器,使用自己构建的定时器进行计时。
2024-01-12 15:37:22
661
原创 C++学习笔记(三十五):c++ 函数指针及lambda表达式
本节介绍c++函数指针。在一些源码中经常能看到c++函数指针,但之前一直觉着这一块比较复杂,就一直没去仔细研究,终于有时间去仔细研究这一块内容了。
2024-01-11 20:59:57
1194
原创 C++学习笔记(三十四):c++ array
本节介绍c++标准库模板中的array和c风格的array的区别,及什么时候使用std::array。
2024-01-11 13:47:27
446
原创 C++学习笔记(三十三):c++ 宏定义
本节对c++的宏定义进行描述。c++使用预处理器来对宏进行操作,我们可以写一些宏来替换代码中的问题,c++的宏是以#开头,预处理器会将所有的宏先进行处理,之后在通过编译器进行编译。宏简单说就是文本替换,可以替换代码中的任何东西,因此过度使用宏会降低代码的可读性。
2024-01-11 11:46:21
508
原创 C++学习笔记(三十一):c++ 模板template
如果模板特别复杂,则会增加排故的工作量,需要花大量的时间去梳理哪些地方的代码已经被编译,哪些地方没有被编译。但类似日志系统之类的则可以使用模板,需要频繁打印不同类型的参数数据等等。从上述三个示例中,可以看出,模板的自由度非常高,但也不是意味着需要处处都使用模板,接下来就个人理解,简单描述什么时候应该使用模板。
2024-01-10 13:51:28
580
原创 C++学习笔记(三十):c++ 多个返回值
通过返回tuple或者pair来返回多个返回值,tuple或者pair在取值的时候相对比较麻烦,而且可读性比较差。在方法的参数中传入接收返回值的变量。这样做的弊端是当要返回的参数太多时,方法的参数将会有很多。
2024-01-10 10:33:54
747
原创 C++学习笔记(二十九):c++ 创建与使用库
在Game中新建Application.cpp文件(名字随意),作为程序的入口,修改Game程序的属性,include中添加Engine.h的路径,可以使用$(SolutionDir)替换。此时编译可正常编译,但链接的时候会报错,因为此时我们未将Print Message函数所在的lib链接到Game中。添加链接的方式:Game工程上 右击->添加->引用,勾选Engine,点击确定,重新生成解决方案即可。
2024-01-09 15:10:28
544
原创 C++学习笔记(二十八):c++ 静态库及动态库的使用
库的使用会很大程度减少我们的工作,本节对c++中静态库和动态库的使用进行简单的介绍。 静态链接库意味着这个库会被放到可执行文件中,在生成的exe中。动态链接库是在程序运行时链接的,可以在程序运行时调用加载库函数的方法来实现,Windows中通过loadLibrary函数完成,也可以在程序启动时通过加载dll文件来动态链接库。主要区别是库文件是否被编译到可执行文件中。 一般网上下载的库都包含库文件和include文件,对于visiualstudio项目,我们必须把include文件指向头文件,这样我们就可
2024-01-08 16:22:34
557
原创 C++学习笔记(二十七):c++ 动态数组vector及优化
vector影响性能的主要原因是当插入新的元素是,原来的vector分配的剩余内存不够时,需要复制原来vector中存在的所有元素,重新分配内存,从而影响程序的性能。下面简单对vector进行优化。
2024-01-08 14:24:26
1181
原创 C++学习笔记(二十五):c++ 智能指针
shared_ptr共享指针:shared_ptr工作方式是通过引用计数跟踪指针的引用数量,当引用计数为0时,释放内存。weak_ptr:j结合share_ptr使用,weak_ptr不会增加引用计数。但share_ptr会增加应用计数。
2024-01-05 14:20:52
990
原创 C++学习笔记(二十一):c++ 创建并初始化对象
c++主要有两种大的方式去创建并初始化对象,一种是在栈上创建,一种是在堆上创建,接下来分别对两种方式进行描述。 在栈上创建,作用域为声明对象所在的作用域,出了作用域,类对象自动释放内存 在堆上创建,出了作用域不主动释放内存,类对象仍会存在内存中,会造成内存泄漏 可以在栈上创建类对象,建议在栈上创建,除了上图中所示的情况以及需要创建大量的类对象时可以使用new在堆上创建,因为栈的空间很小,创建大量的类对象在栈上可能导致栈空间不够。 接下来讲诉c++中的new关键字: new操作就是在内存中找
2024-01-03 10:41:08
432
原创 C++学习笔记(二十):c++ 成员初始化列表
上诉两种初始化方式在特定情形下性能不同,先说结论,建议在任何时候都使用第二种方式进行初始化。上图中在Entity类{}内部初始化Test,则会执行两次Test的构造函数;上图中在Entity类{}外部初始化Test,则会执行一次Test的构造函数。另一种是在构造函数的{}外面进行初始化成员变量。
2024-01-02 17:27:54
574
原创 C++学习笔记(十五):c++可见性
c++可见性 c++的可见性属于面向对象编程概念,指的是类中的某些成员或方法谁可以调用并使用。c++中仅有三个关于可见性的修饰符:public、protected、private。 当类属性或方法为private类型时,基类的属性或方法在子类中不可见,在类实例对象中不可见,如下图所示: 当类属性或方法为protected类型时,基类的属性或方法在子类中可见,在类实例对象中不可见,如下图所示: 当类属性或方法为protected类型时,基类的属性或方法在子类中可见,在类实例对象中也可见
2023-12-22 15:24:40
482
原创 C++学习笔记(十四):接口及虚函数
c++虚函数 c++通过虚函数来实现面向对象中的多态特性。虚函数允许在子类中重写父类的方法。如果在父类中实现一个virtual类型的虚函数,则在子类中可以重写该虚函数。 如果子类继承父类,子类中包含父类同样的方法,但父类中的该方法不是virtual类型的,则会出现如下问题, 上诉代码可正常运行,且执行结果符合预期,但如果在main函数中添加如下代码,程序就不会同预期结果一样进行运行。 如上图红框中部分,我们将一个指向Player的指针赋值给一个Entity指针,之后调用Entity指
2023-12-22 14:34:59
511
原创 C++学习笔记(十三):继承
继承是C++面向对象编程中的重要特性之一。继承允许我们有一个层次结构。包含一个父类,可以先从父类中分离出来,继承父类中已有的属性方法等,同时还可拥有自己独特的属性方法。继承可以通过将公共的方法和属性放在父类中降低代码的重复率。 继承在c++的实现方式: 如上图所示,子类Player拥有父类的属性和方法,同时拥有自己的属性name。
2023-12-21 17:23:01
404
原创 C++学习笔记(十二):析构函数
析构函数一般不用自己手动调用。如果在类中通过new对成员变量分配了内存空间,则可以在析构函数对分配的内存空间进行释放。如上图所示,内存泄漏或者释放无效指针就会产生上图中的错误。
2023-09-20 09:51:33
69
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人