指针的本质--u_char*指针在Nginx源码中的应用及原因

用现代C++包装Nginx C API:RAII与智能指针实践指南 在C++高性能服务器开发中,内存管理与资源生命周期控制是核心挑战。RAII(资源获取即初始化)作为C++的核心范式,通过构造函数与析构函数自动管理资源,有效防止内存泄漏与资源泄露。智能指针(如unique_ptr、shared_ptr)进一步提供了自动化的内存所有权管理,结合类型安全与零开销抽象原则,显著提升了代码的健壮性与可维护性。这些技术在高并发、事件驱动的网络服务器开发中价值尤为突出,能够简化复杂的异步回调与资源释放逻辑。Nginx作为高性能Web服务器与反向代理的事实标准,其C语言API在提供极致性 阅读详情

GNU下的void *p++相当于char *p++ 也就是移动一个字节。

下面的代码是Nginx中内存池的结构体代码,其中last和end是表示内存地址的。

last是u_char*指针类型也就是unsigned char

typedef struct {
    u_char               *last;
    u_char               *end;
    ngx_pool_t           *next;
    ngx_uint_t            failed;
} ngx_pool_data_t;

 

由于unsigned char*指针表示一个字节 所以是0-255之间

257已经需要2个字节10000001,所以如果用unsigned char*类型来声明该段地址(&k),那么多出的部分会被舍去,所以如果对其解引用就是00000001,而不是257


本来,指针变量不管是什么类型其实都完整的存储了“地址”,但是不同类型解引用就会产生对应的值!

nginx移动last指针,分配内存的函数

void *
ngx_palloc(ngx_pool_t *pool, size_t size)
{
    u_char      *m;
    ngx_pool_t  *p;

    if (size <= pool->max) {

        p = pool->current;

        do {
            m = ngx_align_ptr(p->d.last, NGX_ALIGNMENT);

            if ((size_t) (p->d.end - m) >= size) {
                p->d.last = m + size;

                return m;
            }

            p = p->d.next;

        } while (p);

        return ngx_palloc_block(pool, size);
    }

    return ngx_palloc_large(pool, size);
}
声明了一个u_char*m的变量,然后返回给空指针。其实,声明last为空指针也可以,那样要如这里: 指针的本质-void和void*指针在nginx中的应用

感觉自己2篇文章其实还是在说指针,讲同一个东西。


如果需要增加内存

static void *
ngx_palloc_block(ngx_pool_t *pool, size_t size)
{
    u_char      *m;
    size_t       psize;
    ngx_pool_t  *p, *new, *current;

    psize = (size_t) (pool->d.end - (u_char *) pool);

    m = ngx_memalign(NGX_POOL_ALIGNMENT, psize, pool->log);
    if (m == NULL) {
        return NULL;
    }

    new = (ngx_pool_t *) m;

    new->d.end = m + psize;
    new->d.next = NULL;
    new->d.failed = 0;

    m += sizeof(ngx_pool_data_t);
    m = ngx_align_ptr(m, NGX_ALIGNMENT);
    new->d.last = m + size;

    current = pool->current;

    for (p = current; p->d.next; p = p->d.next) {
        if (p->d.failed++ > 4) {
            current = p->d.next;
        }
    }

    p->d.next = new;

    pool->current = current ? current : new;

    return m;
}
先是声明一个u_char      *m; 后面给其分配内存。

然后是讲*m转化为ngx_pool_t   *new= (ngx_pool_t *) m;

然后把new串到p上,p也就是前面已经分配了的内存池(由于空间不够需要扩容)

最后,返回m。最关键就是m  注意:m和new后来就完全不一样了,因为m是last指针,也就是新分配的内存地址!

对于调用ngx_palloc()函数的变量来说,由于ngx_palloc()返回的是void*指针,所以可以给任意其他类型指针!


总结:

因为u_char*和char*指针都是指向1个字节的地址,所以用u_char*和char*指针进行位移运算是非常方便的!这也是为什么nginx用u_char*做last指针类型的原因

设想如果用的是Int*,那么last+1实际上就是+4个字节,非常不方便。

其实用void*也可以定义last指针的,但是这样需要做一次转换在运算的时候!


所谓内存池,就是划一块内存,从内存池中申请就是返回一个地址,和malloc一样本质都是返回一个地址,准确的说是void*!



Nginx模块开发进阶:用C++封装实现高性能与工程化 在Web服务器和高性能网络编程领域,Nginx凭借其事件驱动架构和模块化设计,成为处理高并发的核心组件。其底层C语言接口虽然提供了极致的性能控制,但在开发复杂业务模块时,面向过程的代码结构、繁琐的内存管理和冗长的配置解析,往往导致开发效率低下和可维护性变差。现代C++技术,特别是RAII(资源获取即初始化)、智能指针和模板元编程,为解决这些问题提供了可能。通过零开销抽象原则,C++可以在保持与Nginx C原生接口无缝兼容的前提下,引入自动资源管理、类型安全和声明式配置等特性,从而显著提升模块开发的工程实践 阅读详情

相关推荐

Nginx C模块开发实战:从echo模块深入HTTP处理机制

Nginx C模块是实现高性能、低延迟、高确定性网络逻辑的核心技术路径。其本质是将业务逻辑深度嵌入Nginx事件驱动引擎,依托内存池管理、缓冲区链表(ngx_chain_t)、配置阶段化(preconf/postconf)和HTTP请求生命周期钩子等底层机制,规避解释器开销、进程创建与GC抖动。相比Lua、Python或反向代理方案,C模块在API鉴权、边缘动态注入、安全审计日志等场景中可达成微秒级延迟与零拷贝I/O。本文以可复现的echo模块为入口,解析ngx_module_t结构体、handler执行流

diaozhiwa5526的博客 461

char和uchar区别

char和uchar区别 char 是有符号的, uchar(unsigned char)是无符号的!   1、作为字符来表示的话,两者没有什么区别! 2、作为整数来表示的话,由于char是有符号的,于是数值范围为-128~127     而uchar是无符号的,于是数值范围为0~255,在图像处理中表示像素值范围时用的多! ...

blbq105的博客 1万+

【16】linux命令/工具,systemd,文件操作,动静态库,信号,socket

apt install python3-pip --fix-missing(断开vpn,cp /etc/apt/sources.list /etc/apt/sources.list.bak,python3 -m pip install --upgrade pip,apt-get update,pip install 包名 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com)设置时间,联网,apt-get install vim。

持续更新ing... 6788

char/uchar类型越限总结

我们在文章一和文章二中分析了char和uchar的取值范围和越限的情况。 总结: 1、char/uchar本质是保存的整型数,一个字节的整型数;//所谓的字符型,其实是将整型作为ascii码转换成的字符。 2、char的取值范围 十进制:0至255 十六进制:0至FF 3、uchar的取值范围 十进制:-128至127 十六进制:80至7F 4、char/uchar类型越限: 口诀:高减低加(加减256,类似十进制数的加减10,即:加减循环周期) 十进制:当数据高于最大上限,则减256;当

modi000的博客 1万+

手把手教你用STM32的ADC读取PT100模块,实现高精度温度采集(附完整代码)

本文详细介绍了如何利用STM32的ADC模块读取PT100温度传感器信号,实现高精度温度采集系统。从硬件选型、ADC配置校准到温度计算算法和软件滤波技术,提供完整的实现方案和优化技巧,帮助工程师快速构建稳定可靠的温度监测系统。

weixin_29185199的博客 347

高通引导文件获取全攻略:ELF/MBN提取与EDL救砖实战

在智能手机底层维护中,引导加载程序(Bootloader)是系统启动的第一道关卡。高通平台通过PBL、SBL1/XBL等阶段完成硬件初始化和安全校验,一旦引导分区损坏,设备便可能陷入黑砖状态。此时,掌握ELF与MBN格式的引导镜像获取方法,成为维修工程师和刷机用户的核心技能。通过官方固件包解包或借助EDL模式直接从设备分区备份,均能获得原厂匹配的引导文件。配合Firehose工具和9008端口通信,即可实现分区级读写与救砖恢复。本文从启动链路原理出发,对比两种获取路径的适用场景,并针对驱动识别、文件校验、分

weixin_30175731的博客 421

nginx源码分析 --数据类型

Nginx依据C/C++标准重新定义了三个整数类型来代替标准里的int/long 等类型,编译都能获得一致的结果。

qq_62309585的博客 1121

lidar360 V8.0 & lidar360MLS V8.0雷达点云数据处理软件

机载林业 — 基于机载激光雷达点云数据提取一系列森林结构参数(如:高度分位数、叶面积指数、郁闭度等),分割单木并提取单木参数(包括树的位置、树高、胸径、枝下高、冠幅等属性),利用软件的多种回归分析功能可以结合地面调查数据反演森林生物量、蓄积量等功能参数。还可以生成等高线、山体阴影、坡度、坡向、粗糙度等多种产品。分类 — LiDAR360提供多种分类功能,包括地面点分类、模型关键点分类、选择区域地面点分类、机器学习模型分类(可高效地分离建筑、植被、路灯等通用类别)、深度学习模型分类、自定义深度学习分类等。

2403_83796253的博客 5155

uchar t 单片机C语言的注释是什么,uchar(单片机中uchar是什么意思)

char 是8位字符型数据类型 uchar并没有这样的关键字,只能是一个解释,那就是编程这自定义了一个宏定义,你应该能在程序的开头部分能找到类似#define uchar……….UCHARAn unsigned CHAR.//无符号字符型This type is declared in WinDef.h as follows: // typedef unsigned char UCHAR;材料学,...

weixin_33621208的博客 2万+

等时替代模型( Isotemporal Substitution Model)

文献阅读:Associations of sedentary time and physical activity with adverse health conditions: Outcome-wide analyses using isotemporal substitution model(该论文于2022年4月28日发表在柳叶刀子刊 EClinicalMedicine 上)

姚巨龙的博客 1万+

EMD (经验模态分解) 在 C++ 中的实现指南

EMD 是由 Norden E. Huang 等人在1998年提出的一种适用于非线性和非平稳信号的分析方法。对称性:IMF 的上下包络对称。零交叉点:IMF 的零交叉点数量与极值点数量相同或相差一个。本文详细介绍了如何在C++中实现EMD,包括理论背景、算法步骤、代码实现和优化等内容。通过丰富的代码示例和详细的解释,希望能够帮助读者掌握EMD的基本原理,并能够在实际项目中灵活应用。未来,随着信号处理技术的不断发展,EMD及其变种(如EEMD、CEEMDAN等)将继续在各个领域发挥重要作用。

qq_38334677的博客 1749

uchar和char、schar的区别

一、ucahr:图像处理中常常使用的一种数据类型uchar,一般它指的就是unsigned char,是一种8-bit无符号整形数据,范围为[0, 255],可以查到它的定义为:typedef unsigned char uchar;二、schar:与uchar相对应的是schar,定义为typedef signed char schar;取值范围是[-128, 127];三、char是

CYJ2014go的博客 2万+

蓝牙学习笔记之SMP协议(十四)

目录 写在前面 SM规范简述 安全管理器 加密工具 配对流程 安全属性 IO功能 加密密钥大小 配对算法 低功耗蓝牙安全 密钥和值的定义 分发密钥的生成 密钥分配 安全管理器会话协议 介绍 ​​​​​​​命令格式 写在前面 安全规范协议,主要是描述LE控制器设备配对、认证、加密等过程进行规定,同时也对相关算法进行了说明。 低功耗蓝牙的安全管理经历了几个阶段,L...

在云巅的博客 3662

nginx的指针

指针理解之指针“起源” https://blog.youkuaiyun.com/yunfenglw/article/details/24867883 //begin from 二级指针 : C语言二级数组和二级指针 https://blog.youkuaiyun.com/songsong2017/article/details/83619343 解引用: "*"的作用是引用指针指向的变...

happylzs2008的专栏 237

“EXB文件的格式和编程“

首先,打开文件并读取文件头,然后解析文件头中的元数据信息。接下来,循环读取数据块,每次读取块头部分,解析块的大小和类型,并读取相应大小的块数据。文件头(Header):EXB文件通常包含一个文件头,用于存储关于文件的元数据信息。读取EXB文件时,首先需要解析文件头,以了解文件的属性和数据结构。总结起来,EXB文件是一种常见的二进制数据文件格式,在编程中处理EXB文件需要了解其基本结构和元数据信息。通过以上代码,您可以根据自己的需求扩展处理其他类型的数据块,或者根据EXB文件的具体规范进行解析和处理。

HackCyberX的博客 1535

黑猫带你学eMMC协议第26篇:eMMC的硬件复位操作(H/W reset)

本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 概述 什么是硬件复位? 硬件复位就是使用一个特殊硬件信号(这个信号在RST_n这根实实在在的物理线路上传输)将emmc复位到pre-idle state,而不需要使用cmd0或者power cycle讲emmc复位到pre-idle state。 如何进行硬件复位? 1、设置RST_n_FUNCTION [162]为1,使emm.

黑猫奥利奥的博客 6316

Nginx模块开发实战:从零手写echo模块深入内核机制

Nginx模块开发是理解高性能Web服务器底层原理的核心路径。本文围绕HTTP模块设计原理展开,解析微内核架构、配置驱动状态机、内存池管理三大技术支柱,详解ngx_str_t字符串结构、NGX_CONF_TAKE1位掩码机制、handler函数注册流程等关键概念。通过真实可运行的echo模块案例,揭示Nginx事件驱动模型如何将配置编译为运行时行为,阐明内存零拷贝、响应体精确控制、指令语法校验等工程实践要点。适用于需要定制化HTTP处理逻辑、优化高并发服务或深入Nginx源码的C语言开发者。

xiang_fu的博客 458

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

nginx源码学习之ngx_queue:双向链表

缘由 今天开始看书深入理解Nginx。所以本博客所述的内容大多数都是此书的内容,算作是一种笔记。 ngx_queue ngx_queue是一个双向链表,更多的内容请看深入理解Nginx一书的217页。 其功能和函数一共由两个文件来完成。 ngx_queue.cngx_queue.h 该双向链表完成了常见的功能(在下面的ngx_queue.h文件中可以看到,而在下面的ngx_

zy825316的专栏 835

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Nginx核心结构体ngx_http_conf_addr_t解析与应用

在Web服务器架构中,监听地址管理是网络通信的基础环节。Nginx通过ngx_http_conf_addr_t结构体实现高效的地址配置管理,该结构体包含servers和addrs两个核心数组,分别存储服务器配置和嵌套地址信息。其原理是通过标志位字段(如ssl、http2等)控制协议特性,借助ngx_http_listen_opt_t配置网络参数。这种设计在HTTP/2、SSL/TLS等现代Web协议场景下尤为重要,能有效支持SNI、PROXY协议等高级功能。开发人员可通过该结构体实现端口复用、负载均衡优化等

weixin_30843605的博客 401

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Nginx C++模块开发实战:从C语言扩展到现代C++业务集成

在Web服务器和高性能中间件开发领域,模块化架构是提升系统灵活性和可扩展性的核心设计模式。Nginx作为业界领先的高并发Web服务器,其纯C语言编写的核心模块提供了卓越的性能和稳定性,但面对复杂的业务逻辑集成时,C语言的开发效率与资源管理能力面临挑战。通过引入C++语言扩展Nginx模块,开发者可以在保持Nginx高效事件驱动框架的同时,利用C++的面向对象特性、RAII(资源获取即初始化)机制以及丰富的STL标准库,显著提升复杂业务逻辑的开发效率和代码可维护性。这种混合编程模式的核心技术价值在于,它允许将

weixin_30338497的博客 411

Nginx内存池设计原理与C++高性能内存管理实践

内存管理是高性能服务器开发的核心挑战之一,直接关系到系统的稳定性和吞吐量。传统的内存分配器如malloc/free或new/delete,在频繁进行小内存分配释放的场景下,容易引发内存碎片和锁竞争,导致性能下降。Nginx内存池通过“池化”思想,将内存分配与特定对象的生命周期绑定,实现了批量化管理和一次性释放,从而避免了内存碎片,极大提升了分配效率。这种设计尤其适用于高并发、短生命周期的请求处理场景,例如HTTP服务器、网关和网络中间件。本文深入解析了Nginx内存池的数据结构、分配策略及其在C++项目中的

weixin_34167819的博客 401

Nginx源码分析 - 基础数据结构篇 - 字符串结构 ngx_string.c(08)

Nginx的ngx_str_t字符串结构非常简单和好用。 nxg_string.c文件中包含了很多常用的字符串操作方法,具体我们就不讲解了,主要简单来看下Nginx的字符串数据结构 数据结构定义 ngx_str_t 字符串结构 /** * 字符串结构 */ typedef struct { size_t len; //字符串长度 u_char *d

自娱自乐的代码人 7350

nginx的基本数据类型-双向链表

这就是nginx的链表设计巧妙的地方,如果需要创建双向链表,无需再数据结构体中定义prev和next,只需要添加一个ngx_queue_t成员就可以;通过结构体的 ngx_queue_t成员的偏移量可以获取的结构体的首地址,然后通过强制类型转换就可以得到结构体类型的指针。

hanfengjing的博客 484

C语言在操作系统开发中的核心优势与2026年应用场景分析

系统编程是计算机科学的基础领域,它涉及对硬件资源的直接管理和控制。其核心原理在于通过编程语言与操作系统内核、硬件设备进行高效交互,实现对计算资源的精确调度。这一技术的价值在于能够构建高性能、高可靠性的底层软件,如操作系统内核、设备驱动和嵌入式系统。在应用场景上,系统编程广泛用于实时系统、高性能计算和基础设施软件开发。C语言作为系统编程的经典语言,凭借其贴近硬件的特性、极简的运行时和成熟的工具链生态,在操作系统开发中持续发挥着关键作用。通过指针操作、直接内存管理和无垃圾回收机制,C语言为开发者提供了对性能与资

weixin_33861800的博客 539

ngx_get_full_name

在。

weixin_41812346的博客 269
上一篇: Nginx模块开发
下一篇: linux环境insight安装与使用
unix21
博客等级 码龄14年 115粉丝 248原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值