- 博客(29)
- 收藏
- 关注
原创 open和fopen的区别
open()是系统调用,更底层,提供更直接的控制fopen()是标准库函数,更高级,提供缓冲和格式化I/O在C++中通常使用<fstream>,它内部可能使用这些底层函数选择取决于具体需求:控制精度 vs 开发便利性对于大多数应用层开发,fopen()和 C++ 的<fstream>更合适,因为它们更安全、更方便。只有在需要特定系统功能时才使用open()。
2025-09-13 00:06:40
300
原创 size()和length()的区别
特性size()length()来源所有 STL 容器(如vectorlistmapstring仅存在于类目的返回容器中的元素个数(通用概念)返回字符串的长度(字符个数)(特定概念)返回值size_type(通常是无符号整型,如与size()完全一样推荐度更推荐,因为它是所有容器统一的接口也可以使用,但在非字符串上下文中不可用。
2025-09-11 17:47:48
493
原创 笔试题总结2025.09.10
好的,这是一个关于 C++ 中 和 区别的详细解释。 在编译时执行转换。它信任程序员提供的转换是有效的,不会进行运行时检查。如果转换不安全(例如,将一个指向 的指针转换为 ,但该对象实际上并不是 类型),程序可能会产生未定义行为(崩溃或数据错误)。典型使用场景:2. dynamic_cast 专门用于处理多态类型(即有虚函数的类)的安全向下转换。它在运行时检查转换的有效性。典型使用场景:如何选择?使用 :使用 :简而言之, 是“我相信我知道我在做什么”的转换,而 是“我不确定,请帮我检
2025-09-11 00:55:18
402
原创 assert的用法
/ 使用 && 连接字符串字面量// 或者使用逗号操作符(不太推荐)// 更详细的断言宏// 更详细的断言宏 # define MY_ASSERT(condition , message) \ do {\ if(!\ } \ } while(false) // 使用 MY_ASSERT(ptr!// 更详细的断言宏 # define MY_ASSERT(condition , message) \ do {\ if(!
2025-09-09 23:45:29
408
原创 野指针和悬浮指针的区别
特性悬浮指针野指针主要特征指向已释放的内存未初始化或指向无效地址指针值通常是有效的地址值随机垃圾值或无效地址危险性高度危险(可能暂时正常工作)极度危险(通常立即崩溃)常见场景释放后使用、返回局部变量地址未初始化指针、越界访问检测难度较难(可能隐藏很长时间)较易(通常立即暴露)
2025-09-09 23:06:37
366
原创 内存管理器和内存管理单元的区别
特性内存管理器MMU(内存管理单元)本质软件组件(C++运行时库的一部分)硬件组件(CPU的一部分)层级应用程序/操作系统层面处理器硬件层面主要职责分配和释放堆内存,减少碎片虚拟地址到物理地址的转换,内存保护工作内容管理内存池,处理new/delete请求地址转换,权限检查,缓存管理可见性对程序员可见,可以通过代码交互对程序员透明,由硬件自动处理内存管理器和MMU不是替代关系,而是协同工作内存管理器负责:“这块内存给你用,用完了还给我”MMU负责:“你要访问的内存在这里,而且你有权限访问”
2025-09-09 23:00:40
252
原创 delete释放内存
权限交还:将内存的使用权返还给内存管理器标记空闲:该内存块被标记为可重新分配数据残留:原有数据可能暂时保留,但不能依赖这一点防止泄漏:确保内存可以被重复使用避免碎片:合理的内存释放有助于减少内存碎片核心要点:释放内存不是"擦除数据",而是"放弃使用权"。一旦释放,就不应该再访问那块内存,因为它的内容可能随时被其他代码修改。
2025-09-09 22:59:22
428
原创 new和delete重载实现的对象池应用
优化高频内存操作:通过预分配内存池,减少mallocfree的调用次数。管理空闲对象:使用链表维护空闲对象,快速分配和回收内存。严格配对new与deletenew[]与delete[]必须配对使用。避免混用:对自定义类(含析构函数)必须使用delete[]释放数组。
2025-03-11 17:37:22
503
原创 深入理解new和delete的原理
当类有析构函数时,new[]会额外分配4字节存储元素个数,确保delete[]正确调用每个元素的析构函数。public:Test() { std::cout << "构造Test\n";~Test() { std::cout << "析构Test\n";// 分配3个Test对象// 正确释放return 0;构造Test构造Test构造Test析构Test析构Test析构Test通过重载全局std::cout << "分配 " << size << " 字节\n";
2025-03-11 17:09:42
517
原创 理解容器控件配置器allocator的重要性
以下是一个简化的allocatorpublic:// 分配内存public :// 分配内存 T * allocate(size_t n) {} // 释放内存 void deallocate(T * p) {free(p);} // 构造对象(使用placement new) template < typename . . . Args > void construct(T * p , Args && . . . args) {
2025-03-05 11:21:43
731
原创 实现C++STL向量容器vector代码
自定义vectorfirst:指向数组的起始位置。last:指向最后一个有效元素的后继位置。end:指向数组内存块的后继位置。构造函数private:T* first;// 指向数组首元素T* last;// 指向有效元素的后继位置T* end;// 指向内存块末尾public:public:public :free(p);p -> ~ T();} };free(p);p -> ~ T();} };(args)...);
2025-03-05 11:20:41
413
原创 理解函数模板
函数模板通过参数化类型实现通用性。template <typename T> // 模板参数列表a : b;:声明模板参数,T为类型占位符。类型推导:调用时根据实参类型自动推导T,如max(3, 5)推导为int。原因:分离声明与定义会导致链接错误(模板无法在编译单元外实例化)。核心优势:函数模板通过类型参数化提升代码复用性,适用于容器、算法等通用场景。特例化与重载:合理使用特例化和非模板函数优化特定类型的逻辑。代码组织:始终将模板定义放在头文件中,避免链接错误。示例:通用交换函数。
2025-03-04 16:15:41
926
原创 指向类成员的指针
普通成员指针需指定类作用域,且访问时依赖对象。静态成员指针行为类似全局变量/函数,无需对象。注意内存管理规范,优先使用C++的new/delete。熟练使用成员指针可提升代码灵活性,尤其在模板和回调场景中。通过本文的学习,读者应能掌握指向类成员指针的核心概念,避免常见错误,并理解其在C++高级特性中的价值。
2025-03-04 15:28:45
828
原创 掌握类的各种成员方法以及区别
理解不同类型的类成员是掌握面向对象编程的关键。确保数据的封装性和安全性实现类级别的共享操作保证const对象的正确使用提升代码的可维护性和健壮性在实际开发中,建议遵循"最小权限原则":方法只应获得完成其功能所需的最低访问权限。这种设计理念将显著提高代码质量和可维护性。
2025-03-04 14:58:19
408
原创 掌握构造函数的初始化列表
初始化列表位于构造函数参数列表之后,以冒号开头,用于在对象创建时直接初始化成员变量。构造函数初始化列表是C++对象构造过程中的核心机制。保证对象构造的正确性提高程序运行效率避免初始化顺序导致的隐蔽bug实现更优雅的类设计掌握初始化列表的使用技巧,是成为合格C++开发者的重要里程碑。建议在实际编码中养成使用初始化列表的习惯,并注意类成员的声明顺序,这将显著提高代码质量和可维护性。
2025-03-04 14:28:45
593
原创 类,对象和this指针
/ 输出:Name: Bread, Price: 10.0, Amount: 200// 输出:Name: Air Conditioner, Price: 10000.0, Amount: 50类与对象:类是实体的抽象,对象是类的实例化,二者共同构成OOP的基石。封装与访问控制:通过publicprivate实现数据保护,提升代码健壮性。this指针:隐式传递对象地址,确保成员方法正确操作不同对象的数据。最佳实践优先使用类封装数据,通过公有接口操作私有成员。合理设计Get/Set。
2025-03-02 11:44:51
894
原创 深入理解c++的new和delete
new/delete优势:类型安全、自动初始化和析构、异常处理机制。与malloc/free对比new更适合面向对象编程,malloc适用于底层内存操作。高级用法:定位new用于内存池,提供灵活的错误处理。最佳实践优先使用智能指针管理动态内存。严格匹配new[]与delete[]。在需要高性能的场景中,考虑定位new优化内存布局。延伸阅读《Effective C++》:条款16-17详细讨论资源管理。
2025-03-02 10:49:05
1894
原创 掌握c++的左值引用和初识右值引用
左值引用:简化代码,提升安全性,适用于函数参数传递和返回值优化。右值引用:优化性能,支持移动语义和完美转发,是现代C++高效编程的核心。与指针对比:引用更安全,指针更灵活,需根据场景选择。掌握左值与右值引用是深入理解C++内存管理和性能优化的关键。结合汇编底层分析,能够更好地把握其本质,写出高效、健壮的代码。延伸阅读《Effective Modern C++》:深入探讨右值引用与移动语义的最佳实践。C++标准文档:ISO/IEC 14882:2020,第9章“References”。
2025-03-02 10:00:26
652
原创 掌握const和一二级指针的结合应用
const与指针的结合规则:const在左侧:修饰指向的内容。const在右侧:修饰指针本身。类型转换需严格匹配const修饰,避免间接修改常量。二级指针的const需逐层分析,确保多级间接引用的安全性。掌握const与指针的结合应用,能显著提升代码的可靠性和可维护性。建议通过实际编码练习加深理解,并在团队协作中推广const的合理使用。希望本文能帮助你彻底理解const与指针的复杂关系。如果有疑问,欢迎在评论区讨论!
2025-02-28 16:36:03
783
原创 全面掌握const的用法
深入理解const的底层机制,可以帮助开发者写出更安全、高效的代码。建议通过反汇编工具观察编译器生成的实际指令,结合本文理论分析,建立完整的知识体系。记住:C++的const是编译期契约,而C的const只是语法约定,这种本质差异决定了它们的不同行为模式。
2025-02-27 16:46:17
474
原创 详解函数重载
函数重载(Function Overloading)是指在同一作用域内定义一组函数名相同但参数列表不同的函数。参数列表的差异可以体现在参数的类型、数量或顺序上。// 参数类型:int// 参数类型:double// 参数类型:const char*这些函数共享同一个名称compare,但根据传入的实参类型(如intdouble、字符串),编译器会自动选择匹配的重载版本。提高代码可读性:相同逻辑的函数使用统一名称,如print(int)和。静态多态:编译期确定调用版本,提升性能。
2025-02-27 16:21:57
457
原创 掌握inline内联函数
内联函数是C++性能优化的重要手段,但其应用需权衡代码膨胀与性能收益。理解其底层机制后,开发者可以更精准地判断何时使用inline,并通过符号表或反汇编工具验证效果。在面试中,若能结合调用开销、编译器行为、实际验证方法等多维度阐述,定能给面试官留下深刻印象。
2025-02-27 15:46:47
1750
原创 从编译器的角度的理解c++代码的编译与链接原理
理解编译与链接原理,不仅能帮助开发者更高效地调试程序,还能为学习底层系统知识奠定基础。通过工具实践和理论结合,读者可以深入掌握C++代码从文本到可执行文件的完整生命周期。
2025-02-27 15:43:33
831
原创 掌握形参带默认值的函数
默认值的设置规则从右向左设置形参的默认值必须从右向左依次设置。// 正确:右参数 b 设置默认值// 错误:左参数 a 不能先于右参数设置默认值调用时,未传递的参数必须位于右侧。sum(5);// 合法:a=5,b=20(使用默认值)sum();// 合法:a=10,b=20(需 a、b 均设置默认值)默认值的唯一性// 声明// 定义(错误:b 的默认值重复设置)形参带默认值的函数通过减少参数传递的冗余代码,提升了接口灵活性。其核心规则为从右向左设置默认值,且需注意声明与定义的唯一性。
2025-02-27 14:19:36
1741
原创 从指令角度理解函数调用堆栈详细过程
调试复杂的内存错误分析程序崩溃的core dump进行底层性能优化理解面向对象语言的this指针实现掌握协程/闭包等高级特性的基础通过本文的汇编层析分析,我们可以建立起从高级语言到底层执行的完整认知链条,为后续学习虚函数、异常处理、多线程等高级主题奠定坚实基础。
2025-02-21 19:01:27
613
原创 进程虚拟地址空间区域划分
每个进程在32位Linux系统中拥有4GB虚拟地址空间(用户空间3GB + 内核空间1GB)。:虚拟地址空间是操作系统通过数据结构模拟的抽象内存,不直接对应物理内存。《深入理解计算机系统》(第七章“链接”详解编译、链接与内存布局)。(约800MB):存放内核数据结构(如进程控制块PCB)。用户空间按功能划分不同内存段,内核空间共享且管理核心资源。编译后的代码(如函数体、控制语句)均存放于此。通信需通过内核空间(如匿名管道、共享内存)。优势:内存隔离、内存保护、支持大地址空间。
2025-02-21 17:14:45
673
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅
1