- 博客(20)
- 收藏
- 关注
原创 new和delete重载实现的对象池应用
优化高频内存操作:通过预分配内存池,减少mallocfree的调用次数。管理空闲对象:使用链表维护空闲对象,快速分配和回收内存。严格配对new与deletenew[]与delete[]必须配对使用。避免混用:对自定义类(含析构函数)必须使用delete[]释放数组。
2025-03-11 17:37:22
365
原创 深入理解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
352
原创 理解容器控件配置器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
645
原创 实现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
247
原创 理解函数模板
函数模板通过参数化类型实现通用性。template <typename T> // 模板参数列表a : b;:声明模板参数,T为类型占位符。类型推导:调用时根据实参类型自动推导T,如max(3, 5)推导为int。原因:分离声明与定义会导致链接错误(模板无法在编译单元外实例化)。核心优势:函数模板通过类型参数化提升代码复用性,适用于容器、算法等通用场景。特例化与重载:合理使用特例化和非模板函数优化特定类型的逻辑。代码组织:始终将模板定义放在头文件中,避免链接错误。示例:通用交换函数。
2025-03-04 16:15:41
796
原创 指向类成员的指针
普通成员指针需指定类作用域,且访问时依赖对象。静态成员指针行为类似全局变量/函数,无需对象。注意内存管理规范,优先使用C++的new/delete。熟练使用成员指针可提升代码灵活性,尤其在模板和回调场景中。通过本文的学习,读者应能掌握指向类成员指针的核心概念,避免常见错误,并理解其在C++高级特性中的价值。
2025-03-04 15:28:45
387
原创 掌握类的各种成员方法以及区别
理解不同类型的类成员是掌握面向对象编程的关键。确保数据的封装性和安全性实现类级别的共享操作保证const对象的正确使用提升代码的可维护性和健壮性在实际开发中,建议遵循"最小权限原则":方法只应获得完成其功能所需的最低访问权限。这种设计理念将显著提高代码质量和可维护性。
2025-03-04 14:58:19
295
原创 掌握构造函数的初始化列表
初始化列表位于构造函数参数列表之后,以冒号开头,用于在对象创建时直接初始化成员变量。构造函数初始化列表是C++对象构造过程中的核心机制。保证对象构造的正确性提高程序运行效率避免初始化顺序导致的隐蔽bug实现更优雅的类设计掌握初始化列表的使用技巧,是成为合格C++开发者的重要里程碑。建议在实际编码中养成使用初始化列表的习惯,并注意类成员的声明顺序,这将显著提高代码质量和可维护性。
2025-03-04 14:28:45
414
原创 类,对象和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
816
原创 深入理解c++的new和delete
new/delete优势:类型安全、自动初始化和析构、异常处理机制。与malloc/free对比new更适合面向对象编程,malloc适用于底层内存操作。高级用法:定位new用于内存池,提供灵活的错误处理。最佳实践优先使用智能指针管理动态内存。严格匹配new[]与delete[]。在需要高性能的场景中,考虑定位new优化内存布局。延伸阅读《Effective C++》:条款16-17详细讨论资源管理。
2025-03-02 10:49:05
1478
原创 掌握c++的左值引用和初识右值引用
左值引用:简化代码,提升安全性,适用于函数参数传递和返回值优化。右值引用:优化性能,支持移动语义和完美转发,是现代C++高效编程的核心。与指针对比:引用更安全,指针更灵活,需根据场景选择。掌握左值与右值引用是深入理解C++内存管理和性能优化的关键。结合汇编底层分析,能够更好地把握其本质,写出高效、健壮的代码。延伸阅读《Effective Modern C++》:深入探讨右值引用与移动语义的最佳实践。C++标准文档:ISO/IEC 14882:2020,第9章“References”。
2025-03-02 10:00:26
565
原创 掌握const和一二级指针的结合应用
const与指针的结合规则:const在左侧:修饰指向的内容。const在右侧:修饰指针本身。类型转换需严格匹配const修饰,避免间接修改常量。二级指针的const需逐层分析,确保多级间接引用的安全性。掌握const与指针的结合应用,能显著提升代码的可靠性和可维护性。建议通过实际编码练习加深理解,并在团队协作中推广const的合理使用。希望本文能帮助你彻底理解const与指针的复杂关系。如果有疑问,欢迎在评论区讨论!
2025-02-28 16:36:03
595
原创 全面掌握const的用法
深入理解const的底层机制,可以帮助开发者写出更安全、高效的代码。建议通过反汇编工具观察编译器生成的实际指令,结合本文理论分析,建立完整的知识体系。记住:C++的const是编译期契约,而C的const只是语法约定,这种本质差异决定了它们的不同行为模式。
2025-02-27 16:46:17
354
原创 详解函数重载
函数重载(Function Overloading)是指在同一作用域内定义一组函数名相同但参数列表不同的函数。参数列表的差异可以体现在参数的类型、数量或顺序上。// 参数类型:int// 参数类型:double// 参数类型:const char*这些函数共享同一个名称compare,但根据传入的实参类型(如intdouble、字符串),编译器会自动选择匹配的重载版本。提高代码可读性:相同逻辑的函数使用统一名称,如print(int)和。静态多态:编译期确定调用版本,提升性能。
2025-02-27 16:21:57
375
原创 掌握inline内联函数
内联函数是C++性能优化的重要手段,但其应用需权衡代码膨胀与性能收益。理解其底层机制后,开发者可以更精准地判断何时使用inline,并通过符号表或反汇编工具验证效果。在面试中,若能结合调用开销、编译器行为、实际验证方法等多维度阐述,定能给面试官留下深刻印象。
2025-02-27 15:46:47
1377
原创 从编译器的角度的理解c++代码的编译与链接原理
理解编译与链接原理,不仅能帮助开发者更高效地调试程序,还能为学习底层系统知识奠定基础。通过工具实践和理论结合,读者可以深入掌握C++代码从文本到可执行文件的完整生命周期。
2025-02-27 15:43:33
653
原创 掌握形参带默认值的函数
默认值的设置规则从右向左设置形参的默认值必须从右向左依次设置。// 正确:右参数 b 设置默认值// 错误:左参数 a 不能先于右参数设置默认值调用时,未传递的参数必须位于右侧。sum(5);// 合法:a=5,b=20(使用默认值)sum();// 合法:a=10,b=20(需 a、b 均设置默认值)默认值的唯一性// 声明// 定义(错误:b 的默认值重复设置)形参带默认值的函数通过减少参数传递的冗余代码,提升了接口灵活性。其核心规则为从右向左设置默认值,且需注意声明与定义的唯一性。
2025-02-27 14:19:36
1582
原创 从指令角度理解函数调用堆栈详细过程
调试复杂的内存错误分析程序崩溃的core dump进行底层性能优化理解面向对象语言的this指针实现掌握协程/闭包等高级特性的基础通过本文的汇编层析分析,我们可以建立起从高级语言到底层执行的完整认知链条,为后续学习虚函数、异常处理、多线程等高级主题奠定坚实基础。
2025-02-21 19:01:27
426
原创 进程虚拟地址空间区域划分
每个进程在32位Linux系统中拥有4GB虚拟地址空间(用户空间3GB + 内核空间1GB)。:虚拟地址空间是操作系统通过数据结构模拟的抽象内存,不直接对应物理内存。《深入理解计算机系统》(第七章“链接”详解编译、链接与内存布局)。(约800MB):存放内核数据结构(如进程控制块PCB)。用户空间按功能划分不同内存段,内核空间共享且管理核心资源。编译后的代码(如函数体、控制语句)均存放于此。通信需通过内核空间(如匿名管道、共享内存)。优势:内存隔离、内存保护、支持大地址空间。
2025-02-21 17:14:45
464
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人