![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++11
文章平均质量分 55
Michael_Good
脚踏实地,不负时光!
展开
-
【异步IO】libevent&&libev&&libuv的相关认识
由于libevent和libev对Windows平台支持性较差(不支持完全端口iocp),所以,libuv出现了。最近在网络底层的开发,对于吞吐有一定要求,借机会,也了解了下业内常用的网络库。继承了libevent的优点,也改善了很多libevent中的问题。所以根据当前的业务是有在win平台的部分,所以选择了libuv。libuv是基于libev,,并在win平台上封装了iocp。在libev中对这些问题,进行了极大的改善。原创 2024-08-21 15:15:10 · 335 阅读 · 0 评论 -
【C/C++】C语言如何实现类似C++的智能指针?
需要注意的是,这仅是一个非常简单的实现,而且在C语言中实现动态内存管理与释放还需要程序员格外小心,以避免诸如内存泄漏和悬挂指针等问题。C语言的动态内存管理与C++中的智能指针相比较弱,更多地依赖程序员手动控制资源的生命周期。等,它们管理着所持有对象的生命周期,可以在智能指针被销毁时自动释放其所持有的资源。在C语言中,虽然没有直接的智能指针概念,但我们可以通过构造类似的功能来模拟智能指针的行为。在C语言中,我们可以创建一种类似智能指针的结构体,并为其提供一些基础的功能,比如自动释放分配的内存。原创 2024-06-04 00:38:11 · 1033 阅读 · 1 评论 -
【C/C++】C语言实现std::move
和完美转发是通过语言的高级特性来实现的,这些特性在C语言中并不存在。因此,C语言中的模拟方法需要更多的手动干预和错误检查。用于将一个对象转换为右值引用,以便可以使用移动语义。在C语言中,我们可以通过传递指针来模拟这种行为。请注意,这些模拟方法在C语言中并不完美,因为它们依赖于程序员手动管理资源和指针。结构体,它包含一个指向整数数组的指针。成员复制到目标数组,然后将源数组的成员设置为。函数来分配内存并初始化数组,以及一个。在这个例子中,我们定义了一个。,这样就模拟了所有权的转移。原创 2024-06-04 00:34:48 · 352 阅读 · 0 评论 -
【C/C++】C语言实现完美转发,亲测实例
在C++中,完美转发(Perfect Forwarding)和std::move是两个不同的概念,但它们都与资源的传递和管理有关。在C语言中,由于缺乏C++的模板和右值引用等特性,我们无法直接实现与C++中完全相同的完美转发和std::move。不过,我们可以模拟这些概念的一些行为。原创 2024-06-04 00:33:53 · 158 阅读 · 0 评论 -
【C/C++】C++完美转发解决了什么问题?
在模板函数中,我们可能需要根据参数是左值还是右值来执行不同的操作。它允许模板函数将参数原封不动地传递给另一个函数,同时保持参数的左值或右值属性。当模板函数需要将参数传递给另一个函数时,如果直接传递,可能会导致不必要的复制。例如,如果模板函数接收一个临时对象作为参数,那么这个临时对象会被复制到函数内部,然后在函数结束时再次被销毁。在C++中,完美转发解决了模板函数在传递参数时保持参数类型不变的问题。可以确保在转发参数时,如果参数是左值引用,它将被转发为左值引用;如果参数是右值引用,它将被转发为右值引用。原创 2024-06-04 00:31:02 · 327 阅读 · 0 评论 -
【C/C++】C++11 Lambda表达式捕获变量数量的影响
如果捕获的变量太多,lambda 表达式的执行速度可能会变慢,因为每个捕获的变量都需要在 lambda 表达式创建时进行复制或引用。引用捕获适用于需要在 Lambda 表达式中修改变量的值,或者需要访问变量的状态而不需要复制变量的情况。需要注意的是,如果在 Lambda 表达式中使用引用捕获变量,需要确保在 Lambda 表达式执行期间,被捕获的变量的生命周期不会结束。因此,在编写 lambda 表达式时,应该根据具体的需求选择合适的捕获变量的数量,以平衡程序的行为和性能。原创 2023-08-14 15:40:44 · 239 阅读 · 0 评论 -
【C/C++】C++11 Lambda 表达式捕获变量使用技巧
在 C++11 中,lambda 表达式可以通过捕获列表来捕获指定的变量。捕获列表是放在 lambda 表达式参数列表之前的一对方括号。表示以值的方式捕获变量。方括号中的变量名表示要捕获的变量,多个变量之间用逗号分隔。的值,并对它们进行了修改。在 lambda 表达式执行完毕后,我们再次输出变量。中,用来指定 lambda 表达式捕获哪些变量。在 lambda 表达式中,我们输出了变量。1.值方式捕获变量,该变量可读可写;2.引用方式捕获变量,该变量仅可读;表示以引用的方式捕获变量,的值没有改变,而变量。原创 2023-08-14 15:29:45 · 780 阅读 · 0 评论 -
【C/C++】C++11无序关联容器与有序关联容器的性能测评实验
C++11 提出了无序关联容器。关于新的容器进行实验测评,用以确认其适用场景。原创 2023-04-23 11:48:08 · 126 阅读 · 0 评论 -
【C/C++】C++11 无序关联容器的诞生背景
因此,在需要高效地进行元素的查找、插入和删除操作的场景下,应该使用无序关联容器。但是,由于哈希表的实现方式,无序关联容器的元素并不是按照它们被插入的顺序存储的,因此在需要有序存储元素的场景下,应该使用有序关联容器。由于无序关联容器的实现方式是基于哈希表的,它们使用哈希函数将元素的键映射到哈希表中的位置,因此可以快速地进行元素的查找、插入和删除操作,平均时间复杂度为 O(1)。因此,无序关联容器适用于需要高效地进行元素的查找、插入和删除操作的场景,而有序关联容器则适用于需要有序存储元素的场景。原创 2023-04-23 10:58:21 · 467 阅读 · 0 评论 -
【C/C++】C++11 无序关联容器 unordered_map 与 unordered_set 区别
但是,由于哈希表的实现方式,它们中的元素并不是按照它们被插入的顺序存储的,因此被称为“无序”。都是 C++ STL 中的无序关联容器,它们的主要区别在于存储的元素类型和存储方式。的例子:假设我们需要存储一些学生的信息,包括学生的姓名和年龄。的例子:假设我们需要存储一些整数,且这些整数必须是唯一的。存储的是键值对,每个元素都是一个键值对,其中键和值可以是任意类型。都是无序关联容器,它们的主要区别在于存储的元素类型和存储方式。存储的是唯一元素,每个元素都是一个值,且值必须是唯一的。原创 2023-04-23 10:14:17 · 804 阅读 · 0 评论 -
【C/C++】C++11 线程库重大历史意义
可以看到,使用C++11线程库的代码更加简洁和直观,而且不需要使用复杂的线程管理函数和数据结构。此外,C++11线程库还提供了一些新的语言特性,如lambda表达式和std::thread类等,使得程序员可以更方便地创建和管理线程。C++11 线程库实现原理: 封装库时使用了条件编译,即底层分别调用不同平台(Linux/Win/Mac)的线程API。C++11 线程库解决了历史多线程跨平台问题,增强可移植性。C++11 线程库特点:支持跨平台、支持面向对象封装的类。原创 2023-04-22 20:29:00 · 523 阅读 · 0 评论 -
【C/C++】C++11 智能指针循环引用问题以及解决方案
当需要访问 std::weak_ptr 所指向的对象时,需要先将其转换为 std::shared_ptr,如果转换成功,则说明对象仍然存在,可以安全地访问它。如果转换失败,则说明对象已经被销毁,不能再访问它。对象,并将它们互相引用,形成了一个循环引用。由于智能指针使用引用计数来管理内存,这意味着这两个对象的引用计数永远不会降为 0,它们的析构函数也永远不会被调用,从而导致内存泄漏。的引用就会失效,从而打破循环引用,释放内存。,这样它的引用计数就不会增加。在这个例子中,我们创建了两个。在这个例子中,我们将。原创 2023-04-21 17:11:30 · 879 阅读 · 0 评论 -
【C/C++】C++11 智能指针原理
每当有一个新的指针指向该对象时,其引用计数就会增加 1。当指向该对象的指针被销毁时,其引用计数就会减少 1。当对象的引用计数降为 0 时,说明该对象已经没有被引用的指针了,可以安全地释放其内存。当一个智能指针被创建时,它会自动分配一个对象,并将其引用计数初始化为 1。每当有一个新的智能指针指向该对象时,其引用计数就会增加 1。当对象的引用计数降为 0 时,智能指针会自动调用对象的析构函数,并释放其内存。智能指针是一种 C++ 中的语言特性,它可以自动管理动态分配的内存,避免内存泄漏和悬空指针等问题。原创 2023-04-21 16:55:01 · 117 阅读 · 0 评论 -
【C/C++】C++11 智能指针与普通指针重要区别
用于管理共享所有权的对象,即多个指针可以同时指向该对象,并且当所有指针都超出作用域时才会释放内存。这两种智能指针都提供了更加灵活和安全的内存管理方式,可以大大减少程序中的内存问题。总之,智能指针相比普通指针更加安全和方便,可以避免内存泄漏、悬空指针和竞态条件等问题。但是,智能指针也有一些缺点,例如可能会增加程序的开销和复杂度,需要谨慎使用。智能指针和普通指针都是 C++ 中用于管理动态内存的工具,但它们之间有一些重要的区别。用于管理独占所有权的对象,即同一时间只能有一个指针指向该对象;原创 2023-04-21 11:30:44 · 1553 阅读 · 0 评论 -
【C\C++】C++11 智能指针所有使用场景及实例代码
是共享所有权的智能指针,因此多个线程可以同时访问同一个对象,由智能指针来管理对象的生命周期,避免了多个线程同时访问或释放同一个对象的问题。如何证明 t2 夺取了 t1 的独占式智能指针的使用权),避免了多个线程同时访问同一个对象的问题。这些例子展示了智能指针的更复杂的用法,包括在多线程编程中共享资源、使用独占所有权和共享所有权的智能指针等。是共享所有权的智能指针,因此多个lambda表达式可以同时访问同一个对象,由智能指针来管理对象的生命周期,避免了多个lambda表达式同时访问或释放同一个对象的问题。原创 2023-04-21 10:56:00 · 1126 阅读 · 0 评论 -
【C++11】【函数式编程】C++11函数式编程特性
函数的前两个参数是输入序列的起始和终止迭代器,第三个参数是输出序列的起始迭代器,第四个参数是一个可调用对象,用于对输入序列中的每个元素进行操作。std::transform:std::transform是一个函数模板,可以对一个序列中的每个元素应用一个函数,并将结果存储到另一个序列中。std::bind:std::bind是一个函数适配器,可以将一个可调用对象和一些参数绑定在一起,生成一个新的可调用对象。是一个函数模板,可以对一个序列中的每个元素应用一个函数,并将结果存储到另一个序列中。原创 2023-04-17 21:27:23 · 728 阅读 · 0 评论 -
【C++11】【函数式编程】Lambda 表达式的前世今生
是一种编程范型,它将计算机运算视为数学上的函数计算,并且避免使用程序状态以及易变对象。λ演算,即lambda calculus。原创 2023-04-17 19:29:49 · 633 阅读 · 0 评论 -
【RAII思想】C 实现 RAII 思想
在上面的例子中,定义了一个结构体Resource,包含一个int类型的指针data和两个函数指针init和release。init函数用于初始化资源,release函数用于释放资源。在main函数中,首先使用malloc函数动态分配了一个int类型的内存,然后调用init函数初始化资源。在main函数结束时,调用release函数释放资源。这个例子中,使用结构体封装了资源和相关的操作函数,实现了类似RAII的效果。在结构体的构造函数中获取资源,在结构体的析构函数中释放资源,确保资源的正确获取和释放。原创 2023-04-12 17:19:16 · 190 阅读 · 0 评论 -
【RAII 思想】RAII 基本概念(一种思想)
RAII(Resource Acquisition Is Initialization)是一种C++编程技术,它通过在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。RAII(Resource Acquisition Is Initialization)是一种C++编程技术,它通过在对象的构造函数中获取资源,在对象的析构函数中释放资源,从而确保资源的正确获取和释放。当使用RAII时,资源的获取和释放被封装在对象的构造函数和析构函数中,从而确保资源的正确获取和释放。原创 2023-04-12 17:18:36 · 4728 阅读 · 2 评论 -
【C++11】右值引用完美转发详解
保留参数的值类别:在函数调用时,如果使用传值方式传递参数,会导致参数的值类别被改变,例如将右值转换为左值。使用完美转发可以保留参数的值类别,将左值传递给接受左值引用类型的函数,将右值传递给接受右值引用类型的函数。避免对象移动:在函数调用时,如果使用传值方式传递参数,会导致参数对象的移动构造函数被调用,从而产生额外的开销。综上所述,完美转发可以提高代码的性能和效率,同时保留参数的值类别,支持通用代码的编写,是现代 C++ 编程中不可或缺的一部分。函数将参数以原样转发给函数对象,同时保留参数的值类别。原创 2023-04-12 08:52:49 · 867 阅读 · 0 评论 -
【C++11】新特性 - 右值引用详解
移动语义的本质是将一个对象的资源所有权从一个对象转移到另一个对象,避免不必要的复制和销毁操作,提高程序的性能和效率。对于右值对象,由于其不再被使用,因此可以将其资源所有权转移到另一个对象,避免了不必要的拷贝和销毁操作。而对于左值对象,由于其可能还会被使用,因此不能将其资源所有权转移到另一个对象,否则会导致程序出错。例如,如果将一个左值对象的资源所有权转移到另一个对象,那么原对象就不能再被使用,这可能会导致程序出现未定义行为。当一个对象是左值时,它通常是一个具有名称的变量或对象,它在程序中可能还会被使用。原创 2023-04-11 20:33:04 · 956 阅读 · 0 评论 -
【C++11】右值引用深度详解
完美转发:右值引用可以用于实现完美转发,将一个函数的参数转发给另一个函数,保持参数的原始类型和值,避免不必要的类型转换和拷贝操作,提高程序的灵活性和可维护性。移动语义:右值引用可以用于实现移动语义,将一个对象的资源所有权从一个对象转移到另一个对象,避免不必要的复制和销毁操作,提高程序的性能和效率。可变性:右值引用可以用于实现可变性,允许修改右值对象的状态,避免了对临时对象的拷贝和销毁操作,提高程序的效率和可读性。右值引用的原理是通过将右值引用绑定到一个右值上,实现对右值的移动语义和完美转发等功能。原创 2023-04-11 19:20:05 · 959 阅读 · 0 评论 -
【C++11】自动类型推导(Type Inference)
此外,自动类型推导也不能推导出引用类型,因为引用类型必须在声明时显式指定。编译器在确定变量类型时,通常会根据变量的初始化表达式来推导变量的类型。自动类型推导的缺点是过度使用自动类型推导可能会降低代码的可读性和可维护性,因此需要适度使用。自动类型推导的优点是可以简化代码,减少类型声明的冗余,提高代码的可读性和可维护性。在编译时,编译器会分析变量的初始化表达式,确定表达式的类型,并将。在编译时,编译器会分析变量的初始化表达式,确定变量的类型,并将。关键字推导出的类型可能包含引用类型,因此需要注意类型的精确性。原创 2023-04-11 17:14:22 · 1359 阅读 · 0 评论 -
【C++11】C++11新特性
这些新的功能和语言特性使得 C++11 更加现代化和强大,可以更加方便地实现复杂的应用程序和系统。原创 2023-04-11 17:00:21 · 125 阅读 · 0 评论 -
【Effective C++ 详解】-- 在构造函数中,尽可能地避免调用虚函数、非静态成员函数和虚基类的函数。
因此,在构造函数中应该尽可能地避免调用虚函数、非静态成员函数和虚基类的函数,以避免出现上述问题。对象尚未完全构造:在构造函数中调用虚函数、非静态成员函数和虚基类的函数时,对象可能尚未完全构造,这可能会导致未定义的行为。虚基类的构造函数未被调用:在构造函数中调用虚基类的函数时,虚基类的构造函数可能尚未被调用,这会导致程序出现未定义的行为。虚函数表指针未初始化:在构造函数中调用虚函数时,虚函数表指针可能尚未初始化,这会导致程序崩溃或者出现未定义的行为。原创 2023-04-09 23:25:13 · 66 阅读 · 0 评论 -
《Effective C++》读书纪实 -- 诸君同享
以上是《Effective C++》中的全部50条内容,这些内容涵盖了C++编程的方方面面,对于提高C++编程的效率、可读性和安全性都有很大的帮助。std::initializer_list是C++11引入的重要特性,可以方便地初始化容器、数组等,提高代码的可读性和灵活性。std::function是C++11引入的重要特性,可以实现函数对象的类型擦除,提高代码的灵活性和可读性。委托构造函数是C++11引入的重要特性,可以简化构造函数的实现,提高代码的可读性和灵活性。原创 2023-04-09 23:20:03 · 595 阅读 · 0 评论 -
Windows注入,混淆加密函数名【已亲测】
混淆 DLL 的函数名可以使用函数名加密或函数名混淆的方法来实现。其中,函数名加密是指对 DLL 中的函数名进行加密或哈希,从而使其难以被识别。函数名混淆是指对 DLL 中的函数名进行修改,使其难以被识别和理解。需要注意的是,函数名混淆是一种增加检测难度的防御措施。在实际应用中,还可以采取其他措施来保护 DLL 的安全性,如数字签名、代码签名、动态加密等。原创 2023-03-04 11:36:29 · 426 阅读 · 0 评论