C++20新增属性[[no_unique_address]]详解
有一个古老的c++问题:struct Empty{}; sizeof(Empty); 请问Empty的大小是多少。
很多新手会回答0,但稍有经验的开发者会说出正确答案,大小至少是1字节。
这看起来很奇怪,但这是语言规范决定的:c++要求同一类型的不同实例对象必须拥有完全不同的地址,如果Empty的大小是0,那么想象一下一个元素类型是Empty的数组,这个 ...
C语言之如何定义一个数据类型
本文介绍了如何设计和定义一个新的数据类型,具体包括建立抽象、建立接口和实现接口三个部分。总结这三步法:从思考“做什么”(抽象)到规定“怎么做才对”(接口),最后才是“怎么做到”(实现),这是编写健壮、清晰、可维护代码的基石。
引言
设计一种数据类型包括设计如何储存该数据类型(属性)和设计一系列管理该 ...
lwip-autoip
lwip-2.1.3/src/core/ipv4/autoip.c
AutoIP 通常指的是在动态网络环境中,系统自动为其网络接口分配、管理和使用一个IP地址的技术,而无需依赖中心化的服务器(如DHCP服务器)或手动静态配置
需要使用autoip,需要在opt.h头文件当中使能LWIP_AUTOIP这个宏,通常也会使能LWIP_DHCP_AUTOIP_COOP这个宏
/*
---------------- ...
C语言之可变参数列表
在 C 语言中,可变参数列表(Variable Argument List)通过 stdarg.h 头文件提供的宏和函数来实现。它允许函数接受可变数量的参数,类似于 printf 和 scanf 这样的函数。本文介绍与可变参数列表相关的函数和用法。
核心宏和函数
stdarg.h 提供了以下宏和函数来处理可变参数列表:
宏/函数
作用
va_list
定义一个变 ...
QOJ1087
题目链接
题解
考虑按位思考。将其转换成 \(x_i=0,1\) 的特殊性质,假设此时的二进制位为第 \(k\) 为,那操作就相当于如果 \(x_i\&2^k=1\) 那就等价于特殊性质 \(x_i=1\),反之为 \(0\)。可以差分在 \(O(n^2)\) 的时间复杂度内求出那些位置被覆盖了,即涂了 \(1\),得出 \(a\) 数组(这时定义不合法限制为 \(x_i=0\) 并且 ...
C语言之文件流常用标准库函数
本文总结了在C语言中与文件流相关的标准库函数。
文件流常用标准库函数
使用下列文件流相关函数需要包含头文件stdio.h。
函数
作用
注意事项
打开或关闭文件流
fopen
打开文件,返回指向FILE的指针
需要指定模式(如“r”, “w”, “a”等),并处理可能的文件打开错误
fclose
关闭文件流,释放流资源
确保每 ...
有符号整数的三种编码方式:原码、反码和补码
在计算机中,原码、反码、补码 是用于表示有符号整数的三种编码方式,主要用于解决二进制数的 正负表示 和 加减运算 问题。它们的核心区别在于 符号位的处理 和 负数的表示方法。
原码(Sign-Magnitude)
定义
最高位(最左边的一位)表示符号:
0 表示正数(如 +5)
1 表示负数(如 -5)
其余位表示数值的绝对值。
...
C++ 使用分治减小模板递归深度
起因
C++14 引入 STL 的 make_index_sequence 可以生成一个类型为 std::size_t,0 到 N-1 的编译期序列,我们可以这样使用它:
代码
//利用函数参数推导提取序列
template<std::size_t... Seq>
void foo(std::index_sequence<Seq...>)
{
//使用Seq
}
//利用模板特化提取序列
template<typename>
struct extract_seque ...
P5574 [CmdOI2019] 任务分配问题
题目描述
经典的分 \(k\) 段问题,要求求出分 \(k\) 段后使每段顺序对数量之和最小,求这个最小的值。
思路
首先,我们很好得出这种分段问题的状态转移方程即 $$dp_{i,j}=\min{dp_{k,j-1}+w(k+1,i)}$$ 其中 \(dp_{i,j}\) 表示选到前 \(i\) 个数,分了 \(j\) 段的最小费用,我们可以用 \(O(n^2k)\) 的时间复杂度来实现,显然 ...
基于 epoll 的协程调度器——零基础深入浅出 C++20 协程
前言
上一篇《没有调度器的协程不是好协程》谈到协程如何自动运行,然而那个例子里的调度器还是不太自然,考查一下真实场景,挂起的协程一般是在等待异步事件的完成,如果异步事件没完成就轮到自己执行,它其实还是无法继续,相当于一次无效唤醒。所以这一篇准备引入异步事件,看看在真实的场景下,调度器是如何运作的。
文 ...
井字棋
该游戏为c语言写的练手小游戏
大致分为两部分:
菜单显示
游戏部分
主程序
首先加载菜单
用户选择人机或者双人,进入游戏函数
选择退出时,退出程序
选择不合法选项时,再次加载菜单供用户选择
菜单代码
/**
* @brief 菜单函数
*
* @return 无返回值
*
* @code
* Menu();
* @endcode
*/
void Menu()
{
printf(" ...
HPX高性能并行编程1:C++标准和标准库
1 C++、C++ 标准和 C++ 标准库
1.1 C++、C++ 标准和并行编程简史
C++ 基于 Dennis Ritchie 在贝尔实验室工作期间于 1969 年至 1973 年创建的编程语言 C。1973 年,Ritchie 的编译器被用于编译 PDP-11 计算机的 Unix 内核。这是第一次用汇编语言以外的语言编写操作系统。
遗憾的是,直到 1989 年,官方的 C 标准才出台,各 ...
C/C++与Java混合的JNI编程
Java与C++混合编程可以实现两种语言的优势结合,C++的程序性能很高且支持强大的系统调用能力,Java则生态丰富且开发效率较高。JNI是Java与C++进行混合编程的关键桥梁,本章将基于JNI技术讲述Java与C++混合编程的方法和技巧。
1. Java与JNI
1.1. 什么是Java?
Java是一种高级编程语言,也是一个计算平台(通常指Java虚拟机)。 ...
24位色深bmp图片显示lcd屏幕上
设计一个将24位色深的bmp图片显示到lcd屏幕上,可移植,该程序自己写过之后,又经过了ai的完善和修复后,自己又再次添加一些语句注释
/****************************************************************************
*
* file name: 2025-07-30_filecopy.c
* author : 15515376695@163.com
* date : 2025-07- ...
const char* 指针作为函数参数也能被修改?
问题
如下示例程序所示, 首先构建了一个如下所示的Node树,每个节点存有一个数字。程序需要通过node的name返回其数字,即findNodeNumByName,其中name是const char*,表示方法中不会修改其参数。另外这个参数来自于另外一个方法,即findNodeNameByNum,输入数字找到对应的node的name。所以正确的程序输出应该为输入1,输出 ...
pkg-config【Linux包管理工具】
PkgConfig(pkg-config)是一个在 Linux/Unix 开发中管理库的编译和链接参数的工具,能自动生成正确的头文件路径(-I)、库路径(-L)和链接库名称(-l)等标志。以下为详细使用指南:
pkg-config命令使用
1. 安装
Debian/Ubuntu:
sudo apt-get install pkg-config
CentOS/RHEL:
sudo yum install pkg-config
2 ...
Qt | 四种方式实现多线程导出数据功能
前言
在以往的项目开发中,在很多地方用到了多线程。针对不同的业务逻辑,需要使用不同的多线程实现方法,来达到优化项目的目的。本文记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方式。
示例已上传到gittee,地址:https://gitee.com/zbylalalala1/qt_-thread-dem ...
学习笔记:五种基础排序C语言实现
五种基础排序-升序实现
插入排序
构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
void InsertSort(int buf[], int bufsize)
{
for (int i = 1; i < bufsize; i++){
int temp = buf;
int j = i - 1;
// 只移动,不插入
while (j >= 0 && buf[j] > t ...
实现二叉排序树的前中后序遍历
二叉排序树定义
二叉排序树(Binary Sort Tree),也称为二叉查找树(Binary Search Tree, BST)或有序二叉树,是一种特殊的二叉树数据结构。以下是二叉排序树的一些核心概念:
一个二叉排序树或者是一棵空树,或者是具有以下性质的二叉树:
右子树上所有结点的值均大于它的根结点的值
左子树上所有结点的值均小于它的根结 ...
C语言实现循环队列——始化、入队、出队与完整测试
队列的基本操作实现
1.队列的概念
🌟 队列(Queue)—— 先进先出的数据结构
队列是一种线性数据结构,遵循 “先进先出”(FIFO, First In First Out) 的原则。如现实中的排队:先来的人先被服务,后来的人排在队尾等待。
🔧 基本操作:
入队(Enqueue):在队尾添加一个新元素。
出队(Dequeue):从队头移除一个元素。
...