nginx原始碼初讀(5)--讓煩惱從main開始ngx_array
數組的結構體定義:
<code><span>typedef</span><span>struct</span> ngx_array_s ngx_array_t; <span>struct</span> ngx_array_s { <span>void</span> *elts; <span>// 指向数组存储位置的首地址</span> ngx_uint_t nelts; <span>// 当前数组中已经存放的元素个数</span> size_t size; <span>// 数组中每个元素的大小</span> ngx_uint_t nalloc; <span>// 当前最多能容纳的元素个数,类似cpp中的Vector,当nelts大于nalloc时扩容</span> ngx_pool_t *pool; <span>// 该数组对应的内存池</span> };</code>
下面介紹數組操作函數:
<code>ngx_array_t *ngx_array_create(ngx_pool_t *p, ngx_uint_t n, size_t size); <span>/* 从pool中申请array结构体内存,并调用init初始化(申请n*size内存,改变array内的属性), * 所以元素与结构体内存可能并不连续,但肯定在同一个pool里,失败返回NULL */</span><span>void</span> ngx_array_destroy(ngx_array_t *a); <span>/* 依次销毁数组的数据区和结构体内存,将内存返还给pool(last-=) * if ((u_char *) a + sizeof(ngx_array_t) == p->d.last) { p->d.last = (u_char *) a; } * 销毁结构体的代码如上,因为这代码看起来很奇怪,它怎么知道数组肯定再pool的最后,没加过其他东西了? 看了源码数组也并不是通过单独的pool来管理的,也就是说pool中还可能有很多其他的数据。 在nginx整个代码中没有找到对ngx_array_destroy的引用 */</span><span>void</span> *ngx_array_push(ngx_array_t *a); <span>void</span> *ngx_array_push_n(ngx_array_t *a, ngx_uint_t n); <span>/* 在数组a上新追加元素,并返回指向新元素的指针。需要把返回的指针转换为具体类型, 然后再给新元素本身或者是各字段(如果数组的元素是复杂类型)赋值。*/</span><span>static</span> ngx_inline ngx_int_t ngx_array_init(ngx_array_t *<span>array</span>, ngx_pool_t *pool, ngx_uint_t n, size_t size) <span>/* 如果一个数组对象是被分配在堆上的,那么当调用ngx_array_destroy销毁以后,如果想再次使用,就可以调用此函数。 如果一个数组对象是被分配在栈上的,那么就需要调用此函数,进行初始化的工作以后,才可以使用。*/</span></code>
從以上程式碼中大家有沒有發現一個很嚴肅的問題,不管是destroy還是擴容,源碼中原來的記憶體位置都是沒有free的,這樣肯定造成了內存的浪費,nginx作者這麼計較內存為什麼會有這種問題呢,真心不理解,感覺很容易解決啊。不過肯定有理由把,我們在使用的時候最好事先規劃好陣列的大小,避免多次擴容造成的浪費。
').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); });以上就介紹了nginx原始碼初讀(5)--讓煩惱從main開始ngx_array,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

使用Java的File.length()函數取得檔案的大小檔案大小是在處理檔案作業時很常見的一個需求,Java提供了一個很方便的方法來取得檔案的大小,即使用File類別的length()方法。本文將介紹如何使用此方法來取得檔案的大小,並給出對應的程式碼範例。首先,我們需要建立一個File物件來表示我們想要取得大小的檔案。以下是建立File物件的方法:Filef

標題:C#中使用Array.Sort函數對陣列進行排序的範例正文:在C#中,陣列是一種常用的資料結構,經常需要對陣列進行排序運算。 C#提供了Array類,其中有Sort方法可以方便地對陣列進行排序。本文將示範如何使用C#中的Array.Sort函數對陣列進行排序,並提供具體的程式碼範例。首先,我們要先了解Array.Sort函數的基本用法。 Array.So

在PHP中,有許多強大的陣列函數可以讓陣列的操作更加方便和快速。當我們需要將兩個陣列拼成一個關聯數組時,可以使用PHP的array_combine函數來實現這一操作。這個函數其實是用來將一個陣列的鍵當作另一個陣列的值,合併成一個新的關聯數組。接下來,我們將會講解如何使用PHP中的array_combine函數將兩個陣列拼成關聯數組。了解array_comb

在進行PHP編程時,我們常常需要將數組合併。 PHP提供了array_merge()函數來完成數組合併的工作,但是當數組中存在相同的鍵時,函數會覆寫原來的值。為了解決這個問題,PHP在語言中還提供了一個array_merge_recursive()函數,該函數可以合併數組並保留相同鍵的值,使得程式的設計變得更加靈活。 array_merge

在PHP程式設計中,陣列是一種非常重要的資料結構,能夠輕鬆處理大量資料。 PHP中提供了許多陣列相關的函數,array_fill()就是其中之一。本篇文章將詳細介紹array_fill()函數的用法,以及在實際應用上的一些技巧。一、array_fill()函數概述array_fill()函數的作用是建立一個指定長度的、由相同的值組成的陣列。具體來說,該函數的語法

標題:使用TreeSet類別的size()方法取得樹集合中的元素數量引言TreeSet是Java集合框架中的一種有序集合,它實作了SortedSet接口,使用紅黑樹資料結構來實作。 TreeSet可以依照元素的自然順序進行排序,或是透過Comparator自訂比較器來進行排序。本文將介紹如何使用TreeSet類別的size()方法來取得樹集合中的元素數量,並提供

Java是一種非常強大的程式語言,廣泛應用於各種開發領域。但是,在Java程式設計過程中,開發人員常會遇到ArrayIndexOutOfBoundsException異常。那麼,這個異常的常見原因是什麼呢? ArrayIndexOutOfBoundsException是Java中常見的一個執行時期例外。它表示在存取資料時,數組下標超出了數組的範圍。常見的原因包括以

在PHP程式設計中,陣列是一個常用到的資料型別。而關於陣列的運算子也是相當多的,其中包含了array_change_key_case()函數。這個函數可以將數組中鍵名的大小寫轉換,從而方便我們進行資料的處理。本文就來介紹PHP中array_change_key_case()函數的使用方法。一、函數語法及參數array_change_ke
