
C_C++
文章平均质量分 71
OopspoO
be better
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++杂记——闭包Closure
维基百科解释:在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是在支持头等函数的编程语言中实现词法绑定的一种技术。闭包在实现上是一个结构体,它存储了一个函数(通常是其入口地址)和一个关联的环境(相当于一个符号查找表)。环境里是若干对符号和值的对应关系,它既要包括约束变量(该函数内部绑定的符号),也要包括自由变量(在函数外部定义但在函数内被引用),有些函数也可能没有自由变量。原创 2025-03-03 20:17:16 · 348 阅读 · 0 评论 -
C++杂记——RAII (Resource Acquisition Is Initialization)
RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种C++编程习惯和原则,旨在通过资源的生命周期管理来保证资源的安全和有效使用。RAII的核心思想是将资源的获取和释放绑定到对象的生命周期。当对象被创建时,它会分配相应的资源;当对象的生命周期结束(例如超出作用域时),其析构函数会自动被调用,从而释放资源。它使得我们得以规避“裸new操作”和“裸delete操作”的风险,避免裸new和裸delete可以使我们的代码远离各种潜在风险,避免资源泄漏。原创 2025-03-02 13:29:50 · 357 阅读 · 0 评论 -
C++杂记——返回值优化(RVO,Return Value Optimization)
返回值优化(RVO):当函数返回一个对象的临时副本时,编译器可能会调用移动构造函数来优化性能,尤其是在对象较大的情况下。原创 2025-03-02 13:11:13 · 310 阅读 · 0 评论 -
C++11新特性
c++11新增了几种数据类型:、、等原始字符串简单来说,“原生的、不加处理的”,字符表示的就是自己(所见即所得),引号、斜杠无需 “\” 转义,比如常用的目录表示,引入原始字符串后,非常方便。格式如下:类型别名声明C++11标准规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名:这种方法用关键字using作为别名声明开始,后面紧跟别名和等号,其作用是把等号左侧的名字规定成等号右侧类型的别名。类型别名和类型的名字等价,只要是类型的名字能出现的地方,就能使用类型别名。原创 2025-03-02 13:02:53 · 1196 阅读 · 0 评论 -
C++杂记——RTTI
RTTI(Runtime Type Information)是C++中的一个特性,允许程序在运行时获取类型信息。它主要用于多态(尤其是基于类的多态)时,帮助判断对象的实际类型。RTTI的主要功能RTTI的原理 RTTI的实现依赖于编译器在编译时生成一些额外的信息。注意事项。原创 2025-03-02 00:51:10 · 368 阅读 · 0 评论 -
C++杂记——尾递归
编译器可以做到这一点,因为递归调用是当前活跃期内最后一条待执行的语句,于是当这个调用返回时栈帧中并没有其他事情可以做,因此也就没有保存栈帧的必要了,通过覆盖当前的栈帧而不是在其之上重新添加一个,这样所使用的栈空间就大大缩减了,这使得实际的运行效率会变得更高。注意,后面这段代码的递归也发生在函数末尾,但它不是尾递归。使用尾递归可以带来一个好处:因为进入最后一步后不再需要参考外层函数(caller)的信息,因此没必要保存外层函数的stack,递归需要用的stack只有目前这层函数的,因此避免了栈溢出风险。原创 2025-03-01 23:53:09 · 718 阅读 · 0 评论 -
C++术语
本文总结下C++中的一些术语。原创 2025-02-24 18:58:36 · 802 阅读 · 0 评论 -
C++杂记——Overload、Override和Overwrite
重载的概念最好理解,在同一个类声明范围中,定义了多个名称完全相同、参数(类型或者个数)不相同的函数,就称之为Overload(重载)。重载的特征如下:(1)相同的范围(在同一个类中);(2)函数名字相同;(3)参数不同;(4)virtual 关键字可有可无。也称为改写,覆盖的概念其实是用来实现C++多态性的,即子类重新改写父类声明为virtual的函数。Override(覆盖)的特征如下:(1)不同的范围(分别位于派生类与基类);(2)函数名字相同;(3)参数列表完全相同;(4)基类函数必须有v原创 2025-02-24 12:12:22 · 1500 阅读 · 0 评论 -
C++对象模型
C++一个对象所占的内存空间是多大?原创 2025-02-24 12:12:04 · 248 阅读 · 0 评论 -
C++多线程编程基础
内存模型——memory model:这是对内存并发访问的一组保证,主要是确保简单的普通访问能按人们的朴素预期工作对无锁编程(programming without locks)的支持:这是一些避免数据竞争的细粒度底层机制一个线程(thread)库:这是一组支持传统线程-锁风格的系统级并发编程的组件,如thread、conditional_variable和mutex。原创 2025-02-23 23:58:52 · 971 阅读 · 0 评论 -
C++标准库——move、万能引用和forward
当希望用一个移动操作”窃取“一个对象的表示形式时,使用move;当希望转发一个对象时,用forward。因此,forward(x)总是安全的,而move(x)标记x将被销毁,因此要小心使用。调用move(x)之后x唯一安全的用法就是析构或是赋值的目的。显然,一个特定类型可能提供更多的保证,理想情况下类的不变式保持不变。但是,除非你确切知道这类保证,否则不要依赖他们。原创 2025-02-22 22:24:39 · 587 阅读 · 0 评论 -
C++标准库——时间
标准库提供了time_point,用来表示给定纪元的一个时间点,用给定的clock度量。一个纪元(epoch)就是由给定clock确定的一个时间范围,用duration来衡量,从。其中Rep表示一个算术类型,用于表示时钟ticks数;Period表示一个时钟tick周期(可以理解为一个tick多少秒),这里是一个。在chrono中,标准库提供了基本的时钟接口。在我的系统上,他们的输出是一样的。原创 2025-02-22 19:52:22 · 388 阅读 · 0 评论 -
C++标准库——智能指针
auto_ptr是C++11前标准库提供的一种智能指针,它具有unique_ptr的部分特性,但不是全部。weak_ptr指向一个shared_ptr所管理的对象。它最大的限制是,为了保证所有权唯一,在拷贝复制后,会将原auto_ptr中管理的指针置空,此时再次操作原auto_ptr会导致空指针。若使用计数器用来保持使用计数结构活跃,因为在对象的最后一个shared_ptr的声明期结束后,仍可能有weak_ptr活跃。对weak_ptr而言,为了访问它的对象,必须将它转换成shared_ptr。原创 2025-02-22 15:32:22 · 973 阅读 · 0 评论 -
C++ 标准库——函数对象和函数适配器
在计算机科学中,柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术。许多标准库算法都接受函数对象(或函数)参数,用来控制其工作方式。:g(arg2)等价与f(arg3),其中arg3是通过arg2中的实参替换arg中对应的占位符得到的。另外,bind接受普通表达式做参数,着导致对引用参数而言,在bind看到他们的时候已经被解引用了。所谓函数适配器就是就受一个函数参数,返回一个可以用来调用该函数的函数对象。原创 2025-02-21 23:57:58 · 791 阅读 · 0 评论 -
C++ STL基础
STL(Standard Template Library,标准模板库),顾名思义是一堆C++模板及其支持工具所组成的库,由于STL基本占据了C++标准库的绝大部分内容,所以有时也用STL指代C++标准库。容器(containers):各种数据结构,是一种class template算法(algorithms):各种常用算法,是一种function template迭代器(iterators):连接容器和算法,是所谓的“泛型指针”原创 2025-02-21 17:08:29 · 1037 阅读 · 0 评论 -
CppCheck
cppcheck 是一个静态代码检查工具,支持c, c++ 代码;作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。原创 2023-11-17 00:01:21 · 694 阅读 · 0 评论 -
Effective C++笔记
尽可能延后变量定义式的出现。这样可以增加程序的清晰度并改善程序效率。绝对不要重新定义一个继承而来的缺省参数值,因为缺省参数值都是静态绑定的,而virtual函数——你唯一应该覆写的东西——却是动态绑定的。当我们编写一个class template,而它所提供之“与此template相关的”函数支持“所有参数之隐式类型转换”时,请将那些函数定义为“class template 内部的friend函数”。原创 2025-01-24 21:33:38 · 836 阅读 · 0 评论 -
gcc编译过程简介
fill:#333;color:#333;color:#333;fill:none;原创 2024-06-30 21:54:58 · 901 阅读 · 0 评论 -
C++json库——nlohmann-json
CJSON简单介绍。原创 2023-12-16 15:58:53 · 4752 阅读 · 0 评论 -
C++日志库——spdlog
spdlog是一个仅有头文件的库,只需要拷贝include下面的文件加到本地工程目录并使用支持C++11的编译器编译即可。原创 2024-01-14 21:23:18 · 584 阅读 · 0 评论 -
C标准库函数——printf
C语言printf函数描述C 库函数 int printf(const char *format, …) 发送格式化输出到标准输出 stdout。printf()函数的调用格式为:printf("<格式化字符串>", <参量表>);声明下面是 printf() 函数的声明。int printf(const char *forma...原创 2023-11-14 00:19:30 · 454 阅读 · 0 评论 -
C++的各种初始化
原因同样是创建对象时,要初始类成员的每一个成员(如果没有在初始化列表里面,编译器会自动使用它的默认的构造函数进行初始化,但是它没有默认构造函数,所以会编译报错,所以没有默认构造函数的成员变量需要使用初始化列表进行初始化)能用直接初始化和拷贝初始化的地方都能用列表初始化,而且列表初始化能对容器进行方便的初始化,因此在新的C++标准中,推荐使用列表初始化的方式进行初始化。值初始化和默认初始化一样,对于内置类型初始化为0,对于类类型则调用其默认构造函数,如果没有默认构造函数,则不能进行初始化。原创 2023-03-26 23:05:56 · 7571 阅读 · 0 评论 -
终端输出g_debug()信息
g_debug 输出问题原创 2022-07-27 22:22:34 · 883 阅读 · 0 评论 -
C标准文档
C标准文档原创 2022-06-30 23:03:26 · 944 阅读 · 1 评论 -
C++标准文档
c++标准文档链接原创 2022-06-30 22:42:17 · 1298 阅读 · 0 评论 -
C++ primer笔记
c++ primer笔记原创 2022-06-19 22:04:06 · 745 阅读 · 1 评论 -
0x04基础套接字-回射客户服务器
回射客户/服务器 1. 客户端从标准输入获取一行数据,然后发送到服务器; 2. 服务器收到信息后,不处理消息内容,直接将消息内容原封不动地发送给客户端; 3. 客户端收到后,在标准输出上打印出来。TCP回射客户/服务器程序服务器端/************************************************************************* >原创 2018-04-10 15:45:50 · 283 阅读 · 0 评论 -
0x04基础套接字-简单聊天程序实现
聊天程序实现用多进程方式实现点对点聊天 一个进程用来获得输入,一个进程用来获得对方发来的消息客户端//p2pcli.c#include <stdio.h>#include <string.h>#include <stdlib.h>#include <sys/socket.h>#include <arpa/inet.h>#include <netinet/in.h>#include原创 2018-04-10 15:46:31 · 296 阅读 · 0 评论 -
0x00数据结构——C语言实现(单链表)
0x00数据结构——C语言实现(单链表)/*filename:singly_linked_list.h*//* 单链表(singly linked list)是一种最简单的链表表示,也叫做线性链表。 用它来表示线性表时,用指针表示结点间的逻辑关系。 Functions: (在链表中增加附加头结点的版本) 创建一个空线性表 将链表置为空表 计算表长度 ...原创 2018-04-23 21:09:23 · 429 阅读 · 0 评论 -
0x00数据结构——C语言实现(双链表)
0x00数据结构——C语言实现(双链表)/*filename:double_linked_list.h*//* 双链表(double linked list) Functions: (在链表中增加附加头结点的版本) 创建一个空线性表 将链表置为空表 计算表长度 返回附加头结点的地址 搜索函数:找x在表中的位置,返回表项位置 定位函数...原创 2018-04-23 21:12:47 · 331 阅读 · 0 评论 -
0x00数据结构——C语言实现(单向循环链表)
0x00数据结构——C语言实现(单向循环链表)/*filename:circular_list.h*//* 循环链表(circular list)是另一种形式的表示线性表的链表,与单链表不同的是, 表尾结点的link域中不是NULL而是存放指向链表开始结点的指针。 Functions: 创建一个空线性表 计算表长度 返回附加头结点的地址 搜索函数:...原创 2018-04-23 21:16:54 · 439 阅读 · 0 评论 -
0x00数据结构——C语言实现(双向循环链表)
0x00数据结构——C语言实现(双向循环链表)/* 循环双链表 Functions: (在链表中增加附加头结点的版本) 创建一个空线性表 将链表置为空表 计算表长度 返回附加头结点的地址 搜索函数:找x在表中的位置,返回表项位置 定位函数:返回第i个表项在表中的位置 取第i个表项的值 用x修改第i个表项的内容 ...原创 2018-04-23 21:18:47 · 297 阅读 · 0 评论 -
0x00数据结构——C语言实现(多项式)
0x00数据结构——C语言实现(多项式)/*filename:polynomial*/#ifndef POLYNOMIAL#define POLYNOMIAL//一元多项式的表示//Pn(x)=p0 + p1*x + p2*x^2 + ... + pn*x^n/*基本操作: 创建一个有m项系数和指数的一元多项式p 销毁一元多项式p 打印输出 ...原创 2018-04-24 16:29:33 · 2237 阅读 · 0 评论 -
0x00数据结构——C语言实现(栈+后缀表达式计算)
0x00数据结构——C语言实现(栈)栈的实现/* 栈(tack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈的顶(top)。 对栈的基本操作有Push(进栈)和Pop(出栈)。 Functions: (在链表中增加附加头结点的版本) 创建一个空栈 将栈置为空 计算栈长度 返回栈的地址 栈push操作函数 栈...原创 2018-04-25 14:08:33 · 1839 阅读 · 0 评论 -
0x00数据结构——C语言实现(队列)
0x00数据结构——C语言实现(队列)实现/*使用队列时,插入在一端进行而删除在另一端进行队列的基本操作是入队(enqueue),它是在表的末端(队尾(rear))插入一个元素,还有出队(dequeue),它是删除(或返回)在表的开头(队头(front))的元素。 dequeue(Q) enqueue(Q,X) ...原创 2018-04-25 16:39:54 · 1121 阅读 · 0 评论 -
0x04基础套接字
套接字基本概念创建套接字套接字在Linux系统中表现位文件描述符,形式上由一个int类型定义的整数表示,套接字的创建通过下面的Linux系统调用函数实现:#include #include //头文件sys/type.h对于某些C的宏是必须的;sys/socket.h对于定义socket函数是必须的int socket(int domain原创 2018-04-10 15:44:04 · 1735 阅读 · 1 评论 -
C语言三联序列(trigraph sequences)
ANSI/ISO 9899-1990(ansi c90,又称c89)标准将C语言环境(environment)分为两个:1、翻译环境(translation environment)和2、运行环境(execution environment)。在介绍translation environment 中的翻译阶段(translation phases)的第一步时,提到”Trigraph sequence原创 2017-06-13 19:42:19 · 511 阅读 · 0 评论 -
C语言矩阵传递给函数的方法
C语言矩阵传递给函数的方法先看一道题:A matrix is Toeplitz if every diagonal from top-left to bottom-right has the same element.Now given an M x N matrix, return True if and only if the matrix is Toeplitz.Exampl...原创 2018-07-02 13:37:40 · 5052 阅读 · 0 评论 -
0x01数据结构——C语言实现(二叉查找树)
0x01数据结构——C语言实现(二叉查找树)二叉查找树是一种特殊的二叉树,使二叉树成为二叉查找树的性质是:对于树中的每一个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。这意味着,该树所有的元素可以用某种统一的方式排序。二叉查找树的C语言实现:b_search_tree.h#ifndef B_SEARCH_TREE_H#def...原创 2018-07-01 14:55:33 · 448 阅读 · 0 评论 -
0x01数据结构——C语言实现(二叉树)
0x01数据结构——C语言实现(二叉树)二叉树(binary tree)是一棵树,其中每个节点都不能有多于两个的儿子。二叉树的一个性质是平均二叉树的深度要比N小得多,这个性质有时很重要。分析表明,这个平均深度为O(N−−√)O(N)O(\sqrt{N}),而对于特殊类型的二叉树,即二叉查找树(binary search tree),其深度的平均值是O(logN)O(logN)O(\log...原创 2018-07-01 14:38:41 · 334 阅读 · 0 评论