当前位置: 首页 > 编程日记 > 正文

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

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*



相关文章:

原来这就是乡下人

来源&#xff1a;http://user.qzone.qq.com/313998514/blog/1215427152#!app2&viaQZ.HashRefresh&poscatalog_private 今天早晨一早就去做家教了, 原因是我的学生要去香港去学习七天, 明天就要走了, 所以为了赶时间, 今天的课就提到早晨来上. 这些都很正常, 早晨6:17我…

如何查看Apache的连接数和当前连接数

查看Apache的连接数和当前的连接数以及IP访问次数&#xff0c;下面有个不错的示例&#xff0c;大家可以参考下&#xff0c;希望对大家解决问题有所帮助查看了连接数和当前的连接数 复制代码 代码如下:netstat -ant | grep $ip:80 | wc -l netstat -ant | grep $ip:80 | grep ES…

linux环境insight安装与使用

去官网下载&#xff1a;ftp://sourceware.org/pub/insight/releases 安装步骤 # wget ftp://sourceware.org/pub/insight/releases/insight-6.8-1a.tar.bz2 # tar xvf insight-6.8-1a.tar.bz2 # cd ./ # ./configure --prefix/usr/local/insight # make 注意第一次make…

磁盘加密软件TrueCrypt知识大全(二)之创建文件型加密卷

磁盘加密软件TrueCrypt知识大全&#xff08;二&#xff09;之创建文件型加密卷 1、在“TrueCrypt”窗口中选择“创建加密卷&#xff08;C&#xff09;”按钮&#xff0c;在向导中选择“创建文件型加密卷”&#xff0c;然后一直下一步。 2、在TrueCrypt加密卷创建向导中单击“选…

你的企业在什么情况下需要人工智能?快来看看你需要具备哪些条件与能力吧!...

作者 | Anzhela Sychyk译者 | 风车云马 责编 | 徐威龙出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;如今有关人工智能的炒作多得令人眼花缭乱。各个行业都极力采用这种技术&#xff0c;以获得相对于其他企业的竞争优势——降低运营成本&#xff0c;并改善客户体验。…

struts2学习笔记--线程安全问题小结

在说struts2的线程安全之前,先说一下,什么是线程安全?这是一个网友讲的, 如果你的代码所在的进程中有多个线程在同时运行&#xff0c;而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的&#xff0c;而且其他的变量的值也和预期的是一样的&#x…

函数指针--Nginx和Redis中两种回调函数写法

1.Nginx和Redis中两种回调函数写法 #include <stdio.h>//仿Nginx风格 //结构外声明函数指针类型 typedef void (*ngx_connection_handler_pt)(int c); //仿redis风格 typedef void redisCommandProc(int c); typedef struct { int a; //结构内定义函数指针变量pshow voi…

人生苦短,不光要用Python,还要在VSCode里用

作者 | imbennyguo出品 | CSDN博客在程序员圈子里&#xff0c;Visual Studio Code&#xff08;以下简称VSCode&#xff09;可以说是目前最火的代码编辑器之一了。它是微软出品的一款可扩展的轻量级开源编辑器&#xff0c;并且支持全平台系统。这些特性使得VSCode颇受欢迎&#…

从XXX 产品的失败谈起

从XXX 产品的失败谈起 从去年年中公司开始秘密研究一项高级产品&#xff0c;以替换陈旧体系下的老款产品&#xff0c;为此&#xff0c;创建了一个产品开发部 门&#xff0c;由七八个富有本行业开发经验的全职成员构成&#xff0c;经过一年多的努力&#xff0c;即将投入市场了&…

C++ 经常使用类 string类

6.3.2使用string对象 string word"I love China" *链接字符串* string descriptionadjective " " word; _Note_: 不能连接两个字符串字面量&#xff0c;以下的语句是错误的 string test "I have" "a dream"; 6.3.3訪问字符串中的字…

Nginx源码分析--字符串处理

ngx_string.cvoid ngx_strlow(u_char *dst, u_char *src, size_t n); 将src的前n个字符转换成小写存放在dst字符串当中&#xff0c;调用者需要保证dst指向的空间大于等于n。操作不会对原字符串产生变动。如要更改原字符串&#xff0c;可以&#xff1a;ngx_str_t str ngx_strin…

信息保留的二值神经网络IR-Net,落地性能和实用性俱佳 | CVPR 2020

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导语&#xff1a;在CVPR 2020上&#xff0c;商汤研究院链接与编译组和北京航空航天大学刘祥龙老师团队提出了一种旨在优化前后向传播中信息流的实用、高效的网络二值化新算法IR-Net。不同于以往二值神经网络大多关注量…

Jq-table最后一行添加样式

豪情姓名QQE-mail豪情249056406jikeytanggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.comtony1234567puaggmail.com豪情啊不得了真是的运行代码

Same binary weight (位运算)

题目描述 The binary weight of a positive integer is the number of 1s in its binary representation.for example,the decmial number 1 has a binary weight of 1,and the decimal number 1717 (which is 11010110101 in binary) has a binary weight of 7.Give a positi…

Nginx源码分析--基本数据类型的别名

typedef intptr_t ngx_int_t; typedef uintptr_t ngx_uint_t; typedef intptr_t ngx_flag_t; intptr_t在 # /usr/include/stdint.h 中&#xff0c;下面是stdint.h部分代码 #ifndef _STDINT_H #define _STDINT_H 1#include <features.h> #include…

EnterpriseDB Migration 迁移工具使用测试(2)

下面我们来测试EnterpriseDB Migration 工具对于Oracle 大对象(LOB)的迁移情况&#xff1b; 首先在在Oracle实例Scott模式下创建具有LOB对象的表,如&#xff1a; SQL> create table tlob (t1 int primary key,t2 clob,t3 blob); Table created. -- 并填充数据 SQL> begin…

生物学的机器学习:使用K-Means和PCA进行基因组序列分析 COVID-19接下来如何突变?...

作者 | Andre Ye译者 | 孟翔杰来源 | DeepHub IMBA许多人没有想到&#xff0c;病毒就像地球上为生存而挣扎的其他生物一样&#xff0c;它们会进化或变异。只要看一看人类病毒来源的蝙蝠携带的病毒RNA序列片段即可。AAAATCAAAGCTTGTGTTGAAGAAGTTACAACAACTCTGGAAGAAACTAAGTT…以及…

sql server时间转换

--getdate 获取当前时间select getdate()--dateadd 原有时间加&#xff1a; 2013-02-17 13:20:16 此时间加12个月 select dateadd(MONTH,12,2013-02-17 13:20:16) --返回&#xff1a;2014-02-17 13:20:16.000 &#xff08;参数month可以改为 day&#xff0c;year等日期加相应…

cgdb安装与使用

官网&#xff1a;http://cgdb.github.io/ 安装 # wget http://cgdb.me/files/cgdb-0.6.7.tar.gz # tar -zvxf cgdb-0.6.7.tar.gz # cd cgdb-0.6.7 # ./configure --prefix/usr/local # make && make install 使用 1&#xff1a;cgdb分为上下两栏&#xff0c…

[MFC]多线程传参问题 [AfxBeginThread]

前言MFC中使用多线程比较简单&#xff0c;大家都推荐用AfxBeginThread来实现&#xff0c;但使用过程中确遇到传入this之后不能得到对象内部字段数据的问题。正文一、问题代码1.1 Test.h#pragmaonceclassCTest{public: CTest(void); ~CTest(void); voidThreadMethod…

学习Python,这22个包怎能不掌握?

作者 | Erik-Jan van Baaren译者 | 弯月&#xff0c;责编 | 屠敏头图 | CSDN 下载自东方 IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;如今全球各个行业内 Python 的使用状况怎么样呢&#xff1f;这个问题就是我写这篇文章的初衷。我找…

JSTL标签库的一些基础实例

如题所示&#xff0c;只是一些简单的入门实例&#xff0c;代码如下&#xff1a;<% page language"java" import"java.util.*" pageEncoding"UTF-8"%> <%taglib prefix"c" uri"http://java.sun.com/jsp/jstl/core"%…

旷视提Circle Loss,统一优化视角,革新深度特征学习范式 | CVPR 2020

作者 | 旷视研究院本文是旷视 CVPR 2020的被收录论文解读第。它提出用于深度特征学习的Circle Loss&#xff0c;从相似性对优化角度正式统一了两种基本学习范式&#xff08;分类学习和样本对学习&#xff09;下的损失函数。通过进一步泛化&#xff0c;Circle Loss 获得了更灵活…

收藏好玩的网站

1.输名字出照片 http://turnyournameintoaface.com/?name2.看google页面可以做成这样http://mrdoob.com/projects/chromeexperiments/google_gravity/3. 有趣的在线人脸变动物&#xff08;川剧中有变脸&#xff0c;其实你也可以滴&#xff01;&#xff09;http://youwild.org/…

GDB 格式化结构体输出

set print address set print address on 打开地址输出&#xff0c;当程序显示函数信息时&#xff0c;GDB会显出函数的参数地址。系统默认为打开的&#xff0c; show print address 查看当前地址显示选项是否打开。 set print array set print array on 打开数组显示&#xff…

Kinect For Windows V2开发日志九:侦测并绘制人体骨架

简介 在上一篇《侦测、追踪人体骨架》里&#xff0c;介绍了关节点的使用办法&#xff0c;这一篇记录将关节点与OpenCV结合的绘图方法。 代码 #include <iostream> #include <opencv2\imgproc.hpp> #include <opencv2\calib3d.hpp> #include <opencv2\high…

拨号连接或 ××× 连接的错误代码列表

本文列出了在使用Windows 2000、Windows XP 或 Windows Server 2003 作为客户机&#xff0c;建立拨号连接或 连接时可能收到的错误代码。注意&#xff1a;只有在尝试连接到正运行Windows 2000 或更高版本的路由和远程访问服务器时&#xff0c;才会看到编号高于 900 的错误代码…

“程序员数学不行,干啥都不行!”高级开发:90%都是瞎努力!

之前有很多读者留言向我们反馈&#xff1a;数学不好做算法优化&#xff0c;每次遇到不一样的问题就不会了&#xff0c;要是赶上面试基本就凉凉了。平时很难搞懂像数据结构、算法、复杂的语句等等&#xff0c;因为这些核心原理都是数学。而且光会基础数学远远不够&#xff0c;还…

Redis源码分析--lookupKey函数查看value值

lookupKey函数查看value值 robj *lookupKey(redisDb *db, robj *key) {dictEntry *de dictFind(db->dict,key->ptr);if (de) {robj *val dictGetVal(de);/* Update the access time for the ageing algorithm.* Dont do it if we have a saving child, as this will t…

PHP获取时间排除周六、周日的两个方法

//方法一&#xff1a; <?php $now time(); //指定日期用法 $now strtotime(2014-01-08) ; $day 3600*24; $total 12;$days array() ;for ($i2;$i<$total;$i) {$timer $now$day*$i;$num date("N",$timer)-2; //周一开始if($num>-1 and $num<3){if(c…