C/C++
文章平均质量分 50
1
陈岂几真幸运
冲冲冲
展开
-
Mingw64
安装包。原创 2024-07-29 19:38:19 · 413 阅读 · 0 评论 -
explicit关键字
主要用于或者,为了增强类型安全性和防止意外的类型转换,防止他们被编译器隐式地用于类型转换。原创 2023-10-03 22:53:19 · 338 阅读 · 0 评论 -
如何使用gdb调试coredump文件
coredump是由于程序异常或者bug在运行时异常退出或者终止,进行运行时突然崩溃得一瞬间得快照,生成一个core文件,这个core文件记录了程序在运行过程时得内存,寄存器状态,内存指针和函数堆栈信息等等。2. f 0 :选择要查看的第几行;1. bt:查看调用堆栈情况;3. 找到错误 修复代码。原创 2023-09-19 00:32:24 · 492 阅读 · 0 评论 -
new/delete, malloc/free 内存泄漏如何检测
区别:首先new/delete是运算符,malloc/free是库函数。 malloc/free只开辟内存不初始化;new/delete及开辟内存也初始化。 抛出异常的方式:new/delete开辟失败使用抛出bad_alloc;malloc/free通过返回值判断。 malloc和new区别:malloc是c语言中一个库幻术函数,按字节为数据分配内存,返回类型是 ‘ void * ’。因为他不知道分配的内存会被用于什么类型的对象。 new是运算符,需要传入类型,new相当于运算符的重载函数原创 2023-09-10 21:11:25 · 293 阅读 · 0 评论 -
C++20协程
如果线程有创建几个执行体,给他们指定各自的执行入口,申请一些内存给他们用作执行栈,那么线程就可以按需调度这几个执行体了,为了实现这几个执行体的切换,线程也需要记录他们的控制信息(id、栈的位置、执行入口地址、执行现场)线程可以选择一个执行体来执行,此时CPU中指令指针就会指向这个执行体的执行入口,栈基和栈指针寄存器也会指向线程给它分配的执行栈。要切换执行体时, 需要保存当前执行体的执行现场,然后切换到另外一个执行体,通过一样的方式也可以恢复到之前的执行体,这样就可以从上次中断的地方继续执行。原创 2023-08-09 19:11:51 · 486 阅读 · 0 评论 -
代码编译流程以及constexpr关键字
预处理用于将所有的#include头文件以及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。·删除所有的注释·宏扩展·文件包含。原创 2023-07-21 23:06:35 · 58 阅读 · 0 评论 -
C/C++ 01 面试问题
在编译之前将源代码中的文件进行简单替换。定义常量:通过宏定义可以为某个值定义一个常量,以便在程序中多次使用,避免了手动多次输入相同的数值或字符串。定义函数:简单的函数或代码片段。实现条件编译:宏定义可以根据条件的真假来选择性地包含或排除一些代码,实现条件编译,以便根据不同的编译选项在不同的情况下编译不同的代码。提高代码的可维护性:通过宏定义可以定义一些具有描述性的名称,使代码更易于阅读和理解,提高代码的可维护性。原创 2023-07-17 17:09:59 · 68 阅读 · 0 评论 -
02 函数的调用堆栈详细过程
esp一步步的归为,刚才sum函数return的时候,将值放在eax寄存器中。会把当前指令的下一行的地址压入栈中:也就是执行sum函数之后的那一行。因为此时函数的执行来到了sum函数中,ebp指向sum的栈底。调用方首先压入参数,从右向左,放入栈顶。-858993460({左括号对应指令)(没搞懂写的可能有问题!执行a+b,再把值赋给temp。原创 2023-07-12 20:48:52 · 72 阅读 · 0 评论 -
01 x86 32位Linux进程虚拟地址空间区域划分
任何的编程语言都会产生两种东西:指令和数据。C++代码编译连接后会产生一个.exe可执行文件,放在磁盘上。CPU不可能直接运行磁盘上的程序。CPU首先把程序从磁盘上加载到内存中,那么它把可执行程序的哪些东西加载到内存当中,加载到内存当中如何存放?内存有没有区域的划分,划分了以后是什么样子?原创 2023-07-12 16:37:13 · 212 阅读 · 0 评论 -
Localtime函数
它接受一个指向 time_t 类型的指针作为参数,并返回一个指向。结构体的指针,该结构体包含了年、月、日、时、分、秒等时间信息。原创 2023-07-02 16:44:34 · 5091 阅读 · 0 评论 -
__VA_ARGS__和 ‘...‘ 的区别
是 C/C++ 函数或函数模板中的语法,用于表示可变参数的部分。它通常用在函数定义或函数模板定义中的参数列表的最后,都是用于表示可变参数的特殊标识符,但它们在使用方式和上下文中有一些区别。是 C/C++ 预处理器中的宏定义中的特殊标识符,用于。在函数调用或模板实例化时,可以传入任意数量的参数。它通常用在宏定义中,表示可变参数列表。预处理器中的特殊标识符,只能在宏定义中使用。必须紧跟在宏参数列表的末尾。会被实际的参数序列替换。以下是一个示例,展示了。表示接受可变数量的参数。表示可变参数的占位符。原创 2023-07-02 16:04:39 · 432 阅读 · 0 评论 -
菱形继承问题
为了解决菱形继承带来的问题,C++ 提供了虚继承(Virtual Inheritance)机制。通过使用虚继承,可以确保在菱形继承中只有一份共享的基类子对象,从而解决了数据冗余和二义性的问题。菱形继承(Diamond Inheritance)是一种多重继承的情况,其中派生类继承自两个间接基类,而这两个间接基类又继承自同一个基类,形成了一个菱形的继承关系。中访问这些成员时,会产生二义性,编译器无法确定要使用哪个基类的成员。的成员数据,造成了数据冗余。的方式改为虚继承,可以使用。,而这两个基类都有继承自类。原创 2023-06-19 11:19:13 · 77 阅读 · 0 评论 -
编译连接原理和函数调用
编译连接是将源代码转换为可执行文件的过程。它包括了以下几个步骤:1. 预处理(Preprocessing):预处理器根据预处理指令(如宏定义、头文件引用等),对源代码进行处理,生成经过宏展开和条件编译处理后的代码。2. 编译(Compilation):编译器将预处理后的代码翻译成汇编代码或者机器码,生成目标文件。这个过程包括词法分析、语法分析、语义分析和代码生成等步骤。3. 汇编(Assembly):汇编器将目标文件中的汇编代码翻译成机器指令,生成可重定位的目标文件(如ELF格式的文件)。原创 2023-06-19 10:34:45 · 173 阅读 · 0 评论 -
C++四种cast 类型转换方式
这里使用一个dynamic_cast转换,执行过程中程序会优先尝试将传入的基类指针转化为Derive2类型的,如果传入的p是。const_cast在进行类型强转的时候,地址a的类型是和左边的类型和里面的去掉常量的类型是要保持一致的(提供编译器认为安全的类型转换(没有任何联系的类型之间的转换就被否定了,就编译不通过)则转换成功,可以使用这个指针去调用基类函数,执行不同的函数获得不同的结果。基本上可以实现全部类型的转换,并不能实现全部的,需要使用者自己确定。指针指向的实际对象的类型是派生类。原创 2023-06-12 21:27:30 · 180 阅读 · 0 评论 -
C++类模板实现一个STL顺序容器vector容器
包括:构造函数、析构函数、拷贝构造函数、=运算符重载、push_back() 、pop_back()、返回容器末尾元素back、判断是否满、判断是否空、返回大小、扩容函数expend();原创 2023-06-08 22:21:02 · 185 阅读 · 0 评论 -
C++类模板实现栈
使用类模板实现一个栈包括拷贝构造、入栈、出栈、返回栈顶元素、判断栈是否为空为满原创 2023-06-08 11:02:54 · 577 阅读 · 0 评论 -
函数模板介绍
函数模板是为了对类型进行一个参数化。此时只是声明 还没确定类型 不进行编译在函数调用点进行实例化从调用点走出来后是会从原模版实例化出来一份函数代码的 -》模板函数。原创 2023-06-07 23:18:07 · 40 阅读 · 0 评论 -
C++继承多态
C++继承多态原创 2023-04-26 23:37:34 · 47 阅读 · 0 评论 -
OOP思想
OOP思想原创 2023-04-26 23:33:39 · 137 阅读 · 0 评论 -
函数指针调用不同重载函数
函数指针调用不同重载函数原创 2022-12-05 14:07:20 · 117 阅读 · 0 评论 -
虚函数理解
虚函数原创 2022-11-23 21:27:54 · 209 阅读 · 1 评论