C++学习
文章平均质量分 53
记录一下C++学习过程中的内容
我叫大健
喜欢编程,喜欢摄影
展开
-
C++的vector使用优化
当你创建一个vector,然后使用push_back添加元素,当当前的vector的内存不够时,会从内存中的旧位置复制到内存中的新位置,然后删除删除旧位置的内存,也就是说当我push_back,vector容量不够添加元素就会调整大小,重新分配,这也就是将代码拖慢的原因之一。当我们在push_back的时候,我们实际是在,主函数的当前帧中构造它,所以我们在main的栈上创建它,然后我们需要做的是,把它放到这个vector中,所以我们是从main函数中(把这个创建的vertex)放到实际的vector中。原创 2024-06-03 22:27:46 · 762 阅读 · 0 评论 -
C++之动态数组
C++给我们提供了一个叫Vector的类,这个Vector在std命名空间中。这个Vector有点像一个集合,一个不强制其实际元素具有唯一性的集合,和数组一样,但是和C++普通的数组又不太一样,和标准的数组不同当你创建Vector时,你不需要给他一个边界值,只需要把元素放进去就好了,你每放一个元素进去,这个数组大小会自动增长。上面的注释已经写的非常清楚了,就不赘述了。原创 2024-06-03 16:55:03 · 368 阅读 · 0 评论 -
C++的复制和拷贝构造函数
第一个例子int main()int a = 2;int b = a;//实际是创建一个副本,他俩是独立的变量,它们有不同的内存地址(复制)b = 3;//是可以修改的第二个例子float x, y;int main()//复制的是值,是吧a的值给了b,他们是两个不同的变量,占用的是两个不同的内存b.x = 5;//a中的x(a.x)还会是2第三个例子float x, y;int main()原创 2024-05-28 09:48:32 · 295 阅读 · 0 评论 -
C++之智能指针
我们前面说new delete这些时,new在堆上分配内存,需要delete来删除内存,释放内存,因为堆不会自动的释放内存,而智能指针实现这一自动化的一种方式,这个就是智能指针,当你调用new时,不需要调用delete。shared_ptr共享指针:他的工作方式是引用计数,引用技术其实是一种方法,可以跟踪你的指针有多少个引用,一当引用计数达到0,他就删除了,看下面这个例子。unique_ptr 作用域指针,也就是超出作用域时,它会被销毁,然后调用delete。原创 2024-05-24 09:54:40 · 190 阅读 · 0 评论 -
C++的对象生存期
该内存的大小有限,在终端执行: ulimit -s 可以查看当前系统栈内存的使用上限,我们使用虚拟机ubuntu的栈内存使用上限是8192kb,一旦超过这个限制就会产生段错误。该内存段会随着程序的执行自动的分配(定义局部变量、块变量)、释放(函数执行完毕自动释放局部变量、块变量),虽然使用比较方便,但它的释放不受程序控制,长期使用的数据不能存储在栈内存中。作用域指针,是一个指针的包装器,构造时用堆分配指针,然后再析构时删除指针,所以我们可以自动化这个new 和 delete 比如下面这个例子。原创 2024-05-21 22:30:08 · 251 阅读 · 0 评论 -
C++中的隐式转换和explicit关键字
因为他是const char数组 dajian6个字符加一个空的终止字符,如果要让他正常实现打印,我们需要两次转换,一次const char 到string 一个是string到Entity,但是它只允许一次隐式转换,所以我们有两种方法,一种是包装在一个构造函数中,还有一种则是包装在Entity对象中。),但是他没有,这里就是我们要说的隐式转换,也叫隐式构造,可以隐式的将22转换成一个Entitiy,构造出一个Entity,因为我们的实体类中有构造函数一个接受整数参数,另外一个接受字符串作为参数。原创 2024-05-16 09:44:55 · 196 阅读 · 0 评论 -
C++之new关键字
栈内存是由编译器自动分配和释放的,其分配和释放的速度很快,但栈空间的大小是有限的。的生命周期是确定的,它存在于其定义的作用域内(例如函数内部)。,并在堆上为其分配了一个未初始化的整型变量的空间。int a = 2;类中有需要初始化的资源(如动态分配的内存、文件句柄等),这些资源在使用。,你不需要担心其内存的分配和释放问题,因为编译器会自动处理这些事情。)的,其分配和释放的速度相对较慢,但堆空间的大小通常远大于栈空间。操作符来释放其占用的内存,否则会导致内存泄漏。将被自动销毁,其占用的栈内存也会被自动释放。原创 2024-05-16 08:47:50 · 464 阅读 · 0 评论 -
创建并初始化C++对象(堆和栈的区别)
该内存的大小有限,在终端执行: ulimit -s 可以查看当前系统栈内存的使用上限,我们使用虚拟机ubuntu的栈内存使用上限是8192kb,一旦超过这个限制就会产生段错误。该内存段会随着程序的执行自动的分配(定义局部变量、块变量)、释放(函数执行完毕自动释放局部变量、块变量),虽然使用比较方便,但它的释放不受程序控制,长期使用的数据不能存储在栈内存中。该内存段由程序员手动调用内存管理函数(malloc/free),进行分配、释放,它的分配释放受程序员的控制,适合存储一些需要长期使用的数据。原创 2024-05-14 10:29:48 · 300 阅读 · 0 评论 -
C++的const和mutable
const添加在int类型前保护的是变量的值,但是可以改变指针的指向,我们只是不能改变指针指向的内容。这里的关键在于const是加在*之前还是之后,如果想让指针本身变成常量,不能重新分配指针指向,那就加在*之后变量名之前。在这个代码中,我们是不能修改a的变量值的,因为加了const进行了保护。为了更好的理解const在函数中的作用,也就是const 的第三种用法,他和变量无关,而是在方法名之后(只在类中生效)const就类似与一个保镖一个承诺,用于保护变量,他的优点有很多。原创 2024-05-13 21:14:11 · 151 阅读 · 0 评论 -
C++ 之循环
我们可以对比一下这普通写法和B哥写法,第一种方法就不赘述了(1.for循环里首先执行的是i=0 2.然后执行{ }里的内容,之后3.自增“ ++ ”一下 ,最后才4.是判断),我们看看B哥写的,其实B哥就是用了for循环的特点,首先定义 i 以及一个 flag ,里面为空就默认true,也就是1阶段直接过到2阶段之后自增,在用I原创 2024-04-14 22:59:57 · 176 阅读 · 1 评论 -
C++学习之什么是变量
其实编程的大部分操作都是操作数据,我们在程序中使用任何数据,包括改变他的读写属性,或者是把着数据存储进去,那存储到哪里去呢?就是变量里(在程序运行过程可以变化的量,它是存储数据的容器,需要先定义才能使用)。但我们创建一个变量时,它会被存储在内存中(堆或栈 后面或细致说明内存时怎么工作的),其实不同的变量他们之间最大的区别就是这个变量会占用的时多少的内存(也就是不同数据类型之间的区别)。我们举个例子,我们定义一个int 类型的数据,打印一下他的值(8),一般来说int(整型)是4个字节,但是我们要明白一点数据原创 2024-02-10 21:19:27 · 665 阅读 · 2 评论 -
C++链接器是如何工作的
看看结果,没错他报错了(链接错误),按正常来说我们注释了Multiply这个调用,那log不是也就没用到(log在Multiply函数中),那应该是对的才对啊!并不是这样的,因为在文件汇中,虽然我们没用用到Multiply函数,但是从技术上来说我们是可能在其他地方用到他的,所以连接器就需要链接他就会报错(因为找不到嘛),那么只要告诉链接器,Multiply不会再其他地方用到只会再这个里面用到就可以解决这个问题了,怎么解决呢?加一个static(这意味着Multiply函数只声明在Multiply.cpp中)原创 2024-02-07 19:19:15 · 322 阅读 · 3 评论 -
C++学习之C++编译是如何工作的
接着用我们之前那个hello world的代码来测试一下,直接把末尾的}替换成#include "dajian.h"然后我们clt+F7运行一下,可以看到是没有报错的也就是说编译器在这一步实现的就是打开这导入的文件然后复制到这里。打开文件我们可以看到生成以.i结尾的预处理文件,打开它查看一下,可以发现就是把我们写的dajian.h插入在那里了。接着我们玩点有趣的,在这Math.pp这段代码里加上#if 0 #endif,可以看到它空了,改回1那么.i的文件里的内容又会回来。原创 2024-01-27 18:48:06 · 338 阅读 · 1 评论