![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
C/C++
C/C++
Michael_Good
脚踏实地,不负时光!
展开
-
【C/C++】实现高性能日志轮转功能,已实测
这个程序会检查日志文件的大小,如果超过预设的大小限制,则将当前日志文件重命名,并创建一个新的日志文件。因此,压缩操作通常在日志文件轮转时执行,此时日志文件被关闭,不再有新的写入操作。如果当前日志文件的大小超过了预设的限制,它会将当前日志文件重命名为包含当前时间戳的新文件名,并创建一个新的空日志文件。确保压缩过程中的数据完整性涉及多个方面,包括文件的完整性、压缩过程的正确性以及压缩后文件的可用性。:在压缩之前,确保当前正在写入的日志文件被关闭,以避免在压缩过程中写入数据。:压缩完成后,删除原始的旧日志文件。原创 2024-06-17 23:56:47 · 906 阅读 · 0 评论 -
【C/C++】工业级别的日志文件轮转策略原理
日志文件轮转(Log Rotation)是一种日志管理策略,用于自动管理日志文件的大小和数量。随着应用程序运行时间的增加,日志文件可能会变得非常大,这不仅会占用大量的磁盘空间,还可能影响应用程序的性能。日志文件轮转通过定期地将当前的日志文件重命名或移动到另一个位置,并创建一个新的日志文件来解决这个问题。:当日志文件达到预设的最大大小时,轮转会自动发生。是一个常用的日志文件轮转工具,它能够自动处理日志文件的轮转、压缩和删除。:在轮转过程中,旧的日志文件可以被压缩或归档,以节省磁盘空间并便于长期存储。原创 2024-06-17 23:39:54 · 239 阅读 · 0 评论 -
【C/C++】实参与形参的区别
形参和实参之间的关系是函数调用的核心,形参在函数定义时声明,而实参在函数调用时提供。理解形参和实参的区别对于编写和理解函数调用至关重要。在编程中,形参(形式参数)和实参(实际参数)是函数调用中的两个基本概念,它们在函数定义和函数调用中扮演着不同的角色。形参,规定了函数的样式。实参,是实际调用时传入函数的数据。,它们在函数内部用于接收传递给函数的值。形参,侧重于函数的定义。实参,侧重于函数的调用。实参,强调实际数值。,然后函数计算它们的和并打印出来。函数时,我们传递了两个实参。,这两个值被传递给形参。原创 2024-06-16 18:35:30 · 365 阅读 · 0 评论 -
【QT】QT6.3新特性,以及使用技巧
Qt 6.3作为Qt框架的一个重要更新,引入了许多新特性和改进,以提高开发效率和应用程序性能。原创 2024-06-09 21:05:54 · 547 阅读 · 0 评论 -
【C/C++】C语言如何实现类似C++的智能指针?
需要注意的是,这仅是一个非常简单的实现,而且在C语言中实现动态内存管理与释放还需要程序员格外小心,以避免诸如内存泄漏和悬挂指针等问题。C语言的动态内存管理与C++中的智能指针相比较弱,更多地依赖程序员手动控制资源的生命周期。等,它们管理着所持有对象的生命周期,可以在智能指针被销毁时自动释放其所持有的资源。在C语言中,虽然没有直接的智能指针概念,但我们可以通过构造类似的功能来模拟智能指针的行为。在C语言中,我们可以创建一种类似智能指针的结构体,并为其提供一些基础的功能,比如自动释放分配的内存。原创 2024-06-04 00:38:11 · 1011 阅读 · 1 评论 -
【C/C++】C语言实现std::move
和完美转发是通过语言的高级特性来实现的,这些特性在C语言中并不存在。因此,C语言中的模拟方法需要更多的手动干预和错误检查。用于将一个对象转换为右值引用,以便可以使用移动语义。在C语言中,我们可以通过传递指针来模拟这种行为。请注意,这些模拟方法在C语言中并不完美,因为它们依赖于程序员手动管理资源和指针。结构体,它包含一个指向整数数组的指针。成员复制到目标数组,然后将源数组的成员设置为。函数来分配内存并初始化数组,以及一个。在这个例子中,我们定义了一个。,这样就模拟了所有权的转移。原创 2024-06-04 00:34:48 · 337 阅读 · 0 评论 -
【C/C++】C语言实现完美转发,亲测实例
在C++中,完美转发(Perfect Forwarding)和std::move是两个不同的概念,但它们都与资源的传递和管理有关。在C语言中,由于缺乏C++的模板和右值引用等特性,我们无法直接实现与C++中完全相同的完美转发和std::move。不过,我们可以模拟这些概念的一些行为。原创 2024-06-04 00:33:53 · 131 阅读 · 0 评论 -
【C/C++】C++完美转发解决了什么问题?
在模板函数中,我们可能需要根据参数是左值还是右值来执行不同的操作。它允许模板函数将参数原封不动地传递给另一个函数,同时保持参数的左值或右值属性。当模板函数需要将参数传递给另一个函数时,如果直接传递,可能会导致不必要的复制。例如,如果模板函数接收一个临时对象作为参数,那么这个临时对象会被复制到函数内部,然后在函数结束时再次被销毁。在C++中,完美转发解决了模板函数在传递参数时保持参数类型不变的问题。可以确保在转发参数时,如果参数是左值引用,它将被转发为左值引用;如果参数是右值引用,它将被转发为右值引用。原创 2024-06-04 00:31:02 · 309 阅读 · 0 评论 -
【C/C++】C++类的六个特殊成员函数,附亲测实例
这些特殊成员函数对于类的正确使用至关重要,因为它们确保了类的资源管理(如内存分配和释放)能够正确执行。在设计类时,应该根据类的需要来决定是否需要自定义这些特殊成员函数。如果类中包含动态分配的资源(如指针、文件句柄等),通常需要自定义析构函数来释放这些资源,以避免内存泄漏。同样,如果类需要支持复制或移动操作,也应该提供相应的特殊成员函数。在C++中,类的特殊成员函数是指那些由编译器自动生成的函数,它们在特定情况下会被调用,以支持类的某些操作。原创 2024-06-02 18:43:08 · 359 阅读 · 0 评论 -
【操作系统】Windows平台捕获崩溃现场底层原理,附代码亲测MiniDumpWriteDump
库,用于生成程序崩溃时的内存转储文件(MiniDump)。这个函数是Windows平台下用于捕获程序崩溃时的内存状态的常用方法之一。函数是Windows平台上进行程序崩溃分析的重要工具,它允许开发者在程序崩溃时捕获到程序的完整状态,从而进行深入的调试和问题定位。这个文件就是最终生成的MiniDump文件,它包含了崩溃时的内存快照、寄存器状态、线程信息等。生成的MiniDump文件可以被开发者使用调试工具(如WinDbg)打开和分析,以帮助诊断程序崩溃的原因。参数的设置,决定哪些内存区域需要被转储。原创 2024-06-02 17:04:27 · 267 阅读 · 0 评论 -
【操作系统】Linux、Windows各平台CoreDump机制实现详解
在Windows操作系统中,CoreDump机制被称为“Dump文件”或“转储文件”,它是一种在程序崩溃时捕获程序状态的机制。:CoreDump文件包含了程序在异常终止时的内存信息,包括程序的内存映像、寄存器状态、程序的堆栈信息等。此外,生成的Dump文件可以使用WinDbg等工具进行分析,以帮助开发者调试和修复程序中的问题。在处理过程中,如果信号是CoreDump信号(即可以触发CoreDump的信号),内核会执行一系列操作来生成CoreDump文件。:生成的CoreDump文件可以被调试工具如。原创 2024-06-02 16:55:04 · 723 阅读 · 0 评论 -
【C/C++】子进程与父进程关联与区别
当创建一个子进程时,子进程会进行拷贝部分父进程的部分数据。原创 2023-09-06 10:20:55 · 602 阅读 · 0 评论 -
【C/C++】STL学习所得
然而,对于一些底层的容器,如std::array和std::vector,它们的迭代器可以是指针。这是因为这些容器在内存中是连续存储的,因此可以直接使用指针来表示迭代器。可以利用容器的at方法,进行判断array容器中即将访问的元素是否存在,若不存在at方法,会返回std::out_of_range的异常。迭代器不一定是指针,但它们可以类似于指针的操作。迭代器是一种抽象的概念,它提供了对容器中元素的访问和操作的方式。因为vector容器的内存是连续的,所以可以进行随机访问容器内存。STL 是谁开发的?原创 2023-08-23 23:16:17 · 396 阅读 · 0 评论 -
【C/C++】实参与形参的区别
在函数调用时,实参的值会被传递给对应的形参,函数内部就可以使用这些形参进行计算或操作。在上面的例子中,函数add的形参x和y分别被赋值为1和2,然后计算它们的和并返回结果3。具体来说,形参是函数定义时声明的变量,用于接收函数调用时传递的实参。而实参是在函数调用时传递给函数的值或变量。总之,形参和实参是函数调用中非常重要的概念,理解它们的区别对于编写正确的函数和调用函数非常重要。在C语言中,函数的形参是指在函数定义时声明的参数,而实参是指在函数调用时传递给函数的参数。原创 2023-08-17 16:51:26 · 481 阅读 · 0 评论 -
【C/C++】C/C++中所有关键字详解
C++ 共计 81个关键字。C 共计 37个关键字。原创 2023-08-17 11:33:49 · 227 阅读 · 0 评论 -
【C/C++】实现模板类数据结构 -- 栈 (亲测可用)
在C++中,可以使用模板类来定义通用的数据结构或算法,以适应不同类型的数据。是一个占位符类型,可以在类中使用。你可以根据需要选择其他的占位符名称,比如使用。通过使用模板类,你可以在不同的类型上重用相同的代码,提高代码的复用性和灵活性。上面的代码分别创建了一个存储整数和浮点数的栈,并进行了一些操作。作为类型参数来定义类的成员变量、成员函数和构造函数。使用模板类时,你可以根据需要指定具体的类型参数。是栈中元素的类型,可以是任意类型。在模板类的定义中,你可以使用。上面的代码定义了一个模板类。原创 2023-08-16 16:17:05 · 399 阅读 · 0 评论 -
【C/C++】STL queue 非线程安全接口,危险!
STL 中的 queue 是非线程安全的,一个组合操作:front();pop() 先读取队首元素然后删除队首元素,若是有多个线程执行这个组合操作的话,可能会发生执行序列交替执行,导致一些意想不到的行为。实际结果:队列已为空,但由于STL queue 属于非线程安全接口,导致无同步机制保障,多个线程同时访问同一数据。实际执行出队线程,并未同步已出队的数据至其他出队线程,导致队列为空,依旧访问。致使线程崩溃,进程崩溃。实测场景: 1个线程数据入队,4个线程竞争出队。原创 2023-08-14 21:22:57 · 378 阅读 · 0 评论 -
【C/C++】C++11 Lambda表达式捕获变量数量的影响
如果捕获的变量太多,lambda 表达式的执行速度可能会变慢,因为每个捕获的变量都需要在 lambda 表达式创建时进行复制或引用。引用捕获适用于需要在 Lambda 表达式中修改变量的值,或者需要访问变量的状态而不需要复制变量的情况。需要注意的是,如果在 Lambda 表达式中使用引用捕获变量,需要确保在 Lambda 表达式执行期间,被捕获的变量的生命周期不会结束。因此,在编写 lambda 表达式时,应该根据具体的需求选择合适的捕获变量的数量,以平衡程序的行为和性能。原创 2023-08-14 15:40:44 · 202 阅读 · 0 评论 -
【C/C++】C++11 Lambda 表达式捕获变量使用技巧
在 C++11 中,lambda 表达式可以通过捕获列表来捕获指定的变量。捕获列表是放在 lambda 表达式参数列表之前的一对方括号。表示以值的方式捕获变量。方括号中的变量名表示要捕获的变量,多个变量之间用逗号分隔。的值,并对它们进行了修改。在 lambda 表达式执行完毕后,我们再次输出变量。中,用来指定 lambda 表达式捕获哪些变量。在 lambda 表达式中,我们输出了变量。1.值方式捕获变量,该变量可读可写;2.引用方式捕获变量,该变量仅可读;表示以引用的方式捕获变量,的值没有改变,而变量。原创 2023-08-14 15:29:45 · 709 阅读 · 0 评论 -
【C/C++】C++11 std::this_thread::yield() 原理
的作用是提高多线程程序的效率和公平性。在多线程程序中,如果某个线程长时间占用 CPU 资源,其他线程就会被迫等待,导致程序的效率降低。是 C++11 中的一个函数,它的作用是让当前线程主动让出 CPU 时间片,以便让其他线程有机会运行。并不能保证当前线程一定会让出 CPU 时间片,因为具体的调度策略是由操作系统决定的。也不能保证其他线程一定会立即运行,因为其他线程可能还处于阻塞状态。,可以让所有线程都有机会运行,从而提高程序的效率和公平性。后,当前线程会进入就绪状态,等待系统重新调度。原创 2023-08-14 14:38:08 · 1028 阅读 · 0 评论 -
【C/C++】关于C++构造函数成员初始化
因为成员初始化列表可以直接初始化成员变量,而不需要先调用默认构造函数再赋值。因此,在实际开发中,应该尽可能使用成员初始化列表来初始化类的成员变量。在构造函数的参数列表后使用冒号分割的一组初始化语句。在构造函数内部使用赋值语句进行初始化变量。原创 2023-08-11 18:26:36 · 468 阅读 · 0 评论 -
【C/C++】重载运算符特性
需要注意的是,重载运算符应该遵循一些规则,例如,应该保持运算符的语义与内置类型的语义一致,避免过度使用运算符重载等。此外,重载运算符应该谨慎使用,只在必要的情况下使用,以避免代码的混乱和不必要的复杂性。重载运算符是 C++ 中的一个重要特性,它允许程序员自定义类类型的运算符行为。原创 2023-08-10 20:12:45 · 294 阅读 · 0 评论 -
【C/C++】重载运算符特性
需要注意的是,重载运算符应该遵循一些规则,例如,应该保持运算符的语义与内置类型的语义一致,避免过度使用运算符重载等。此外,重载运算符应该谨慎使用,只在必要的情况下使用,以避免代码的混乱和不必要的复杂性。重载运算符是 C++ 中的一个重要特性,它允许程序员自定义类类型的运算符行为。原创 2023-08-10 10:59:18 · 171 阅读 · 0 评论 -
【C/C++】std::vector 优化点(官方同步)
在上面的代码中,我们使用 reserve() 方法预留了 100 个元素的空间,然后使用 push_back() 方法插入了 100 个元素。使用 std::move():使用 std::move() 将元素从一个 vector 移动到另一个 vector,避免了拷贝构造函数和拷贝赋值运算符的调用,提高了元素的移动效率。使用 std::vector::data():使用 std::vector::data() 方法获取 vector 的底层数据指针,可以避免拷贝操作,提高访问效率。原创 2023-08-10 10:39:12 · 516 阅读 · 0 评论 -
【C/C++】C语言位图操作实例(亲测)
我们首先计算出这个位在位图数组中的索引,然后使用位运算中的左移运算符将1移动到正确的位置,并使用位运算中的取反运算符将这个值取反。最后,我们使用位运算中的与运算符将这个值与位图数组中的对应元素进行与运算,这样就可以将这个位设置为0。然后,我们使用位运算中的与运算符将这个值与位图数组中的对应元素进行与运算,如果结果不为0,那么这个位就是1,否则就是0。这个函数将位图中的第bit位设置为1。最后,我们使用位运算中的或运算符将这个值与位图数组中的对应元素进行或运算,这样就可以将这个位设置为1。原创 2023-08-09 14:57:33 · 341 阅读 · 0 评论 -
【C/C++】C++11 在各编译器版本支持详情
需要注意的是,不同编译器对 C++11 的支持程度可能有所不同,因此在使用 C++11 特性时需要仔细查看编译器的文档,以确保代码能够正确编译。原创 2023-07-31 20:14:37 · 2111 阅读 · 0 评论 -
【C/C++】 printf 如何打印 DWORD
同时,如果要在 Windows 中使用 printf 函数,需要将编译选项设置为 /D _CRT_SECURE_NO_WARNINGS,以避免编译器报错。DWORD 是一个 32 位的无符号整数类型,可以使用 %u 或者 %lu 格式化符号来打印它。如果要打印十六进制的 DWORD 数据,可以使用 %x 或者 %lx 格式化符号。其中,%x 是用来打印十六进制无符号整数的格式化符号,0x 是前缀,用来表示这是一个十六进制数。其中,%u 是用来打印无符号整数的格式化符号,\n 是换行符,用来换行。原创 2023-07-24 19:27:15 · 1007 阅读 · 0 评论 -
【C/C++】 printf 如何打印 DWORD
同时,如果要在 Windows 中使用 printf 函数,需要将编译选项设置为 /D _CRT_SECURE_NO_WARNINGS,以避免编译器报错。DWORD 是一个 32 位的无符号整数类型,可以使用 %u 或者 %lu 格式化符号来打印它。如果要打印十六进制的 DWORD 数据,可以使用 %x 或者 %lx 格式化符号。其中,%x 是用来打印十六进制无符号整数的格式化符号,0x 是前缀,用来表示这是一个十六进制数。其中,%u 是用来打印无符号整数的格式化符号,\n 是换行符,用来换行。原创 2023-07-24 16:31:43 · 690 阅读 · 0 评论 -
【C/C++】巧妙的超时时间事件判断
很巧妙的判断,让人叹为观止!不多说,直接上干货。原创 2023-07-21 14:49:44 · 675 阅读 · 0 评论 -
【C/C++】关于函数约定回调
栈的清理方式:stdcall 调用约定规定了栈的清理方式,即由被调用函数负责清理栈空间,这种方式可以减少栈空间的分配和释放次数,从而提高函数调用的效率。而与之相比,cdecl 调用约定则是将参数从左向右依次压入栈中,这种方式更符合人类的思维习惯,但是会增加栈空间的分配和释放次数,从而降低函数调用的效率。综上所述,stdcall 调用约定与其他调用约定相比,具有参数传递方式简单、函数调用效率高、返回值处理方式简单、兼容性好等优点,因此在 Windows 平台上,许多函数都采用了这种调用约定。原创 2023-07-17 16:42:46 · 177 阅读 · 0 评论 -
【C/C++】free(NULL) 合法吗?
如果在初始化时未将指针初始化为 NULL,而后又调用了 free 函数,可能会导致程序出现未定义的行为。这是因为在 C 和 C++ 中,free 函数只能释放由 malloc、calloc 或 realloc 等函数分配的内存,如果你试图释放一个未分配的内存块,或者重复释放已经释放的内存块,都会导致程序出现未定义的行为,例如程序崩溃、数据损坏等。因此,为了避免这种情况的发生,建议在定义指针变量时就将其初始化为 NULL,这样可以确保在调用 free 函数时,即使指针未被分配内存,也不会出现问题。原创 2023-07-17 14:29:29 · 1326 阅读 · 0 评论 -
【C/C++】代码优化之路
代码短路(short-circuit)是一种计算机程序中的优化技术,它可以在逻辑运算中提前结束计算,从而节省计算资源和时间。在逻辑运算中,如果第一个操作数已经能够确定整个表达式的结果,那么就不需要再计算第二个操作数了,这就是代码短路的原理。例如,在逻辑运算中,如果第一个操作数为假(false),那么整个表达式的结果就一定为假,此时就可以直接返回结果,而不需要再计算第二个操作数。代码短路可以提高程序的执行效率,特别是在处理大量数据时,可以显著减少计算时间和资源消耗。原创 2023-07-17 10:43:31 · 72 阅读 · 0 评论 -
【C/C++】栈内存布局,堆栈内存被破坏的现象及可能原因
为了避免堆栈内存被破坏,需要编写安全的代码,遵循内存管理的规范,使用安全的函数和算法,避免指针错误和并发问题等。当程序访问栈内存或堆内存时,如果访问了未分配的内存、已释放的内存、越界的内存等,就可能会导致堆栈内存被破坏的现象。指针错误:如果程序使用了未初始化的指针、空指针或野指针,可能会导致指针错误,进而导致堆栈内存被破坏。数据错误:如果堆栈内存被破坏导致数据被篡改,可能会导致程序出现错误的结果,影响程序的正确性。内存泄漏:如果程序没有正确释放动态分配的内存,可能会导致内存泄漏,进而导致堆栈内存被破坏。原创 2023-06-25 16:25:19 · 1496 阅读 · 0 评论 -
【C/C++】vector 扩容要以1.5倍或者2倍的终极原因
C++ STL 中的 vector 扩容策略是以原来的1.5倍或者2倍扩容,这样的策略可以保证在平均情况下(经过大量测试),每次需要扩容的次数都是最少的,从而减少了整体的内存开销。在扩容的同时,STL 中的 vector 还会重新分配内存,把原来的数据拷贝到新的内存空间中,为了避免内存浪费,将原来的内存空间释放。C++ STL vector是一种动态数组,在存储空间不足时可以自动扩容。原创 2023-06-20 20:26:12 · 412 阅读 · 0 评论 -
【C/C++】指针数组踩了坑
如果需要修改字符串中的字符,可以将字符串复制到一个可写的char数组中,然后通过指针来修改数组中的字符。的,不能通过指针来修改其中的字符。,str指向的是一个字符串常量,那么它是。跑起来,直接dump。原创 2023-06-20 16:18:21 · 70 阅读 · 0 评论 -
【C/C++】关于 bzero 函数
bzero()函数通常用于初始化一段内存区域,例如清空一个字符数组或结构体变量。它与memset()函数类似,但是bzero()函数只能将内存区域清零,而memset()函数可以将内存区域设置为任意指定的值。需要注意的是,bzero()函数已经被标记为废弃函数,不再建议使用。在新的代码中,可以使用memset()函数来代替bzero()函数。bzero()函数用于将一段内存区域清零,即将这段内存区域中的所有字节都设置为0。其中,s是指向要清零的内存区域的指针,n是要清零的字节数。原创 2023-06-20 14:18:04 · 3648 阅读 · 0 评论 -
【C/C++】实现日志格式化
在这个代码实例中,定义了两个宏LOG_INFO和LOG_ERROR,分别用于输出INFO和ERROR级别的日志。这些宏使用了可变参数宏的特性,可以自动填充文件名和行号。在调用LOG_INFO和LOG_ERROR时,只需要传递格式化字符串和参数列表即可。这种方式可以方便地实现日志的格式化和输出,并且可以自动填充文件名和行号,减少了代码的重复性。在C语言中,可以使用宏来自动填充文件名和行号。原创 2023-06-20 10:32:38 · 207 阅读 · 0 评论 -
【C/C++】Visual Studio 如何查看当前使用的C语言版本
需要注意的是,Visual Studio支持多个C语言版本,可以在“语言”选项卡中选择不同的版本。如果需要切换C语言版本,可以在“语言”选项卡中选择新的版本,然后重新编译项目即可。如果当前项目没有使用C语言,或者没有设置C语言版本,则在“语言”选项卡中可能没有相关的选项。在“语言”选项卡中,可以看到当前使用的C语言版本,例如“ISO C11”。打开Visual Studio,打开一个C语言项目。在属性窗口中,选择“C/C++”->“语言”。在菜单栏中选择“项目”->“属性”。原创 2023-06-19 20:23:03 · 6925 阅读 · 0 评论 -
【C/C++】C/C++ 如何定义全局变量
其中,extern 关键字用于声明全局变量,告诉编译器该变量是在其他源文件中定义的。在头文件中定义全局变量时,需要使用 extern 关键字声明变量,但是不需要进行初始化。在源文件中定义全局变量时,需要进行初始化,可以将变量的初始值赋给它。需要注意的是,全局变量的使用应该谨慎,因为全局变量会增加程序的耦合性,使程序难以维护和扩展。在实际编程中,应该尽量避免使用全局变量,而是使用局部变量或者类成员变量来实现相同的功能。全局变量是指在程序的任何地方都可以访问的变量,它的作用域是整个程序。原创 2023-06-05 15:23:24 · 8278 阅读 · 0 评论 -
【C/C++】VC++高效判断应用版本号区间大小
在上面的示例代码中,CompareVersion函数接受两个字符串形式的版本号作为参数,并返回一个整数值,表示它们的大小关系。如果第一个版本号大于第二个版本号,则返回1;如果第一个版本号小于第二个版本号,则返回-1;如果两个版本号相等,则返回0。这个方法的思路是将版本号按照.分割成多个整数,然后逐个比较这些整数的大小。如果两个版本号的前几个整数相等,那么就比较它们的下一个整数,直到找到不相等的整数为止。如果一个版本号的整数比另一个版本号的整数多,那么就认为它更大。更高效的比较版本号的方法。原创 2023-05-24 16:33:50 · 365 阅读 · 0 评论