
C++
文章平均质量分 74
C++知识记录
@hdd
good good study, day day up
展开
-
C++ | 多线程
使用细粒度锁或读写锁(std::shared_mutex):优先使用线程本地存储(thread_local)(Mutex):保证资源独占访问的同步机制。:多个线程同时访问共享资源导致未定义行为。:分离线程(后台运行,无法再join):避免false sharing(使用。:分离关注点(如网络通信与数据处理):避免主线程阻塞(如UI界面):同时执行I/O操作与计算任务。:多个线程相互等待导致永久阻塞。:程序启动时默认创建的线程。(C++20):线程同步点。:检查线程是否可join。:如原子操作或并发容器。原创 2025-04-04 08:00:00 · 608 阅读 · 0 评论 -
C++ | 信号处理
信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断。有些信号不能被程序捕获,但是下表所列信号可以在程序中捕获,并可以基于信号采取适当的动作。这些信号是定义在 C头文件 <csignal> 中。信号值宏定义触发场景1SIGHUP终端连接断开2SIGINT键盘中断(Ctrl+C)6SIGABRT调用abort()触发8SIGFPE算术运算错误11SIGSEGV。原创 2025-04-04 08:00:00 · 138 阅读 · 0 评论 -
C++ | 类模板
template <typename T> // 每个成员函数都需要模板声明// 实现代码。原创 2025-04-03 15:54:04 · 316 阅读 · 0 评论 -
C++ | 函数模板
A:使用static_assert添加约束,或使用concepts(C++20)编写数学计算函数(支持int、float、double等)明确类型要求,必要时使用static_assert。A:是的,但现代编译器会进行优化,合理设计可控制体积。A:不能,虚函数需要运行时多态,而模板是编译期机制。在C++开发中,我们经常遇到需要编写。需要为每个类型重复编写几乎相同的代码。A:当两者都匹配时,优先选择普通函数。创建泛型容器操作(如排序、查找)优先考虑重载,特殊需求才用特化。将复杂逻辑拆分为非模板函数。原创 2025-04-03 15:46:46 · 406 阅读 · 0 评论 -
C++ | 文件读写(ofstream/ifstream/fstream)
本文介绍如何从文件读取流和向文件写入流。这就需要用到 C++ 中另一个标准库 fstream,它定义了三个新的数据类型:ofstream、ifstream、fstream原创 2025-04-03 15:36:24 · 663 阅读 · 0 评论 -
C++ | for的多种使用方法
for 循环是 C++ 中最基础且灵活的控制结构之一,无论是遍历数组、处理容器,还是实现复杂逻辑,都离不开它的身影。随着 C++ 标准的演进(如 C++11、C++17),for 循环的用法变得更加多样化和高效。本文将从基础到高阶,全面解析 C++ 中 for 循环的多种使用方式,帮助你在不同场景下写出更简洁、更安全的代码。原创 2025-03-31 09:57:31 · 239 阅读 · 0 评论 -
C++ | std::function
std::function是 C++ 中管理可调用对象的利器,它通过统一的接口简化了代码逻辑,增强了灵活性。尽管存在一定的性能开销,但在大多数应用场景中,其带来的开发效率提升远超性能损失。合理利用可以使代码更模块化、可维护性更强。适用场景建议需要动态切换函数行为时实现回调、事件处理等机制时设计模式(如策略模式、观察者模式)的实现相关扩展结合std::bind绑定参数了解(C++17)实现通用调用。原创 2025-03-31 09:49:02 · 575 阅读 · 0 评论 -
深入理解函数调用约定:stdcall、cdecl、fastcall、thiscall 的区别与应用
在C/C++开发中,函数调用约定(Calling Convention)决定了函数参数如何传递、栈空间由谁清理、函数名修饰规则等底层细节。:由调用者(Caller)还是被调用函数(Callee)清理栈。:在逆向工程中,识别调用约定可帮助理解参数传递和栈平衡逻辑。略优,因为栈清理只需一次(在函数内部),但差异通常可以忽略。参数从右到左压栈(MSVC)或寄存器优先(GCC)。:不同编译器对调用约定的名称修饰规则不同(如。C/C++默认调用约定(非类成员函数)。A:确保调用约定一致,否则会导致栈错误。原创 2025-03-27 16:46:17 · 490 阅读 · 0 评论 -
C++ | constexpr
在C++中,constexpr是一个强大的关键字,它允许我们在编译时完成计算和对象的初始化,从而提升程序性能并增强代码的可维护性。从C++11到C++20,constexpr的功能不断扩展,成为现代C++开发中不可或缺的工具。本文将深入探讨constexpr的核心概念、使用场景及最佳实践原创 2025-03-27 16:38:45 · 313 阅读 · 0 评论 -
C++ | new操作符的异常行为
new的异常行为是C++内存管理的核心问题之一。如果希望内存分配失败时返回空指针而非抛出异常,可以使用。的异常行为对编写健壮的内存管理代码至关重要。操作符)是可能触发异常的典型场景之一。:析构函数不应抛出异常,且需保证资源释放。分配失败,构造函数抛出异常,此时。在C++中,动态内存分配(通过。无法分配足够内存时,会抛出。:在性能关键代码中,使用。若对象的构造函数中通过。:使用RAII对象(如。原创 2025-03-26 08:00:00 · 291 阅读 · 0 评论 -
C++ | 异常处理
本文将从语法、底层原理、常见陷阱到最佳实践,全面解析C++异常处理的核心要点。,逐个退出函数作用域,并调用局部对象的析构函数,确保资源释放。若析构函数抛出异常,程序将直接终止(在C++编程中,异常处理是保证程序健壮性的重要机制。异常处理是C++中管理错误的核心机制,正确使用能大幅提升代码可靠性。:异常处理成本较高,适合处理“异常”情况(如文件缺失、网络中断)。关键字抛出,可以抛出任意类型(内置类型、对象、指针等),但。,避免滥用异常,才能写出高效且健壮的程序。:异常发生后,程序状态合法,无资源泄漏。原创 2025-03-26 07:30:00 · 591 阅读 · 0 评论 -
C++ | static inline
表示该函数仅在当前编译单元(即当前源文件)内可见,其他文件无法链接到它。,以减少函数调用的开销。在C++中,它完美平衡了代码复用与性能,是替代宏和避免ODR问题的利器。在C/C++中有多种含义,但在函数定义中,它的核心作用是。:普通函数在多个源文件中重复定义会导致链接错误,而。函数允许在多个编译单元中重复存在,链接时选择其一。函数仍需在源文件中提供外部定义,C++则无此要求。确保函数在编译单元内私有化,避免链接冲突。建议编译器优化,并允许在头文件中多次定义。变量,允许在头文件中定义变量,但函数仍需。原创 2025-03-25 07:00:00 · 859 阅读 · 0 评论 -
C++ | Lambda表达式
代码简洁:替代冗长的仿函数。上下文访问:通过捕获机制直接使用局部变量。灵活适配:兼容、模板参数。原创 2025-03-15 09:15:00 · 439 阅读 · 0 评论 -
C++ | 智能指针
在 C++ 编程中,内存管理一直是一个重要且复杂的问题。手动管理内存容易引发如内存泄漏、悬空指针等一系列问题,不仅增加了程序的调试难度,还可能影响程序的稳定性和性能。为了解决这些问题,C++11 引入了智能指针(Smart Pointers)这一强大工具。本文将深入探讨 C++ 智能指针的原理、优势及其常见使用场景。原创 2025-02-17 22:35:13 · 1133 阅读 · 0 评论 -
C++ | 虚函数
虚函数是 C++ 中用于实现动态多态的成员函数。在基类中使用virtual关键字声明虚函数后,派生类能够重写(override)该函数。这样一来,当通过基类指针或引用调用此函数时,实际执行的将是派生类中的函数版本。// 使用示例上述代码中,Animal类声明了虚函数makeSound,Dog类继承自Animal类并重写了makeSound函数。原创 2025-02-17 21:42:21 · 1018 阅读 · 0 评论 -
C++ | extern “C“
在 C++ 编程中,extern "C"是一个非常重要的特性,它主要用于解决 C++ 与 C 代码之间的相互调用问题。本文将深入探讨extern "C"的作用、使用原因以及具体的使用方法。原创 2025-02-12 20:46:09 · 1120 阅读 · 0 评论 -
C++ | int和string的相互转化
int转string1.使用标准库中的to_string()函数string str = "This is " + to_string(888);cout << str<< endl; //输出 This is 888该函数原型有下面九种,可以将整型、浮点型等转换为stringstring to_string (int val);string to_string (long val);string to_string (long long val...原创 2021-04-02 09:51:01 · 213 阅读 · 0 评论 -
C++实现简单的String类
class MString{public: MString(const char* str = NULL); MString(const MString& str); //拷贝构造 ~MString(); MString& operator=(const MString &str); //赋值private: char* m_data; int m_length;};MString::MString(const char* str){ if (str.原创 2021-03-23 22:29:05 · 140 阅读 · 0 评论 -
C++ | 类型转换
static_cast、const_cast、dynamic_cast原创 2020-10-06 10:20:43 · 303 阅读 · 0 评论 -
C++ | 子类对象调用父类函数
在C++中子类对象调用父类函数可通过域操作符(::)来实现,表明所调用函数的作用域。//test.cc#include <iostream>using namespace std;class A{public: virtual void func() { cout <<" this is A" << endl; }};class B : public A{public: virtual void func() { cout &l原创 2020-09-24 09:04:04 · 17744 阅读 · 0 评论 -
在main()函数之前执行的函数
1、全局变量和静态变量的构造函数、赋值函数 全局变量和静态变量的初始化就是 在main函数之前执行的、而对其初始化需要调用的就是其构造函数和赋值函数2、若想要普通函数在在main()之前执行需要加 __attribute__((constructor)) 修饰,如void void __attribute__((constructor)) func(){ std::cout << "before main " << endl }相同的,想让函数在main...原创 2020-09-22 14:49:02 · 2227 阅读 · 0 评论 -
std::move()
std::move() 是C++11的新特性,作用是 将参数转换成右值, 相当于一个类型转换 static_cast<T&&>(value)对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝;可以避免不必要的内存拷贝使用move()后原参数的的值为空函数原型template <typename T>typename remove_reference<T>::type&& move(T&原创 2020-09-07 14:41:25 · 548 阅读 · 0 评论 -
C++关键字之explicit
explicit关键字的作用就是防止类构造函数的隐式自动转换。explicit只能用于修饰只有一个参数的类构造函数,它的作用是表明该构造函数是显示的, 而非隐式的,跟它相对应的另一个关键字是implicit,意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。在C++中, 如果的构造函数只有一个参数时, 那么在编译的时候就会有一个缺省的转换操作:将该构造函数对应数据类型的数据转换为该类对象.如果类构造函数参数大于或等于两个时,是不会产生隐式转换的,当除了第一个参数以外的其他参..原创 2020-09-02 13:45:26 · 300 阅读 · 0 评论