Ubuntu 下 nginx-1.24.0 源碼分析 - ngx_array_init 函數

ngx_array_init

定義在?src/core/ngx_array.h

static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)
{/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "array->nelts" may be used without having been initialized*/array->nelts = 0;array->size = size;array->nalloc = n;array->pool = pool;array->elts = ngx_palloc(pool, n * size);if (array->elts == NULL) {return NGX_ERROR;}return NGX_OK;
}

ngx_array_init 函數的作用

ngx_array_init 是一個靜態內聯函數,用于初始化一個 ngx_array_t 對象。它的主要任務是:

  1. 設置數組的基本屬性(如元素大小、預分配數量等)。
  2. 分配內存以存儲數組元素。
  3. 返回初始化是否成功的狀態。

函數簽名

static ngx_inline ngx_int_t
ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size)

參數解析

ngx_array_t *array

作用 :指向需要初始化的動態數組對象。

調用者需要提供一個已經分配好的 ngx_array_t 對象

函數會填充該對象的各個字段,完成初始化

ngx_pool_t *pool

作用 :指定用于分配內存的 Nginx 內存池。

Nginx 使用內存池機制來管理內存,pool 是內存池的核心對象。

數組元素的存儲空間將從這個內存池中分配。

ngx_uint_t n

作用 :指定數組的初始容量,即預分配的元素數量。

n 表示數組最多可以存儲多少個元素。

如果實際存儲的元素數量超過 n,則需要擴容

size_t size

作用 :指定數組中每個元素的大小(單位為字節)。

size 通常是通過 sizeof 計算得出的類型大小。

函數會根據 sizen 計算出需要分配的總內存大小(n * size)。

返回值類型 ngx_int_t

NGX_OK :表示初始化成功。

NGX_ERROR :表示初始化失敗。

如果內存分配成功且所有字段都正確初始化,則返回 NGX_OK

如果內存分配失敗(ngx_palloc 返回 NULL),則返回 NGX_ERROR

?

array->nelts = 0;

?將 nelts 設置為 0,表示當前數組中還沒有存儲任何元素


ngx_array_t

typedef struct {void        *elts;     // 指向數組元素的內存塊ngx_uint_t   nelts;    // 當前數組中已存儲的元素數量size_t       size;     // 每個元素的大小(單位為字節)ngx_uint_t   nalloc;   // 數組預分配的元素數量ngx_pool_t  *pool;     // 內存池指針,用于分配內存
} ngx_array_t;
  • elts :指向實際存儲數組元素的內存區域。
  • nelts :記錄當前數組中已經存儲的元素數量。
  • size :每個元素的大小,通常通過 sizeof 計算得出。
  • nalloc :數組預分配的空間大小,表示最多可以存儲多少個元素。
  • pool :Nginx 的內存池對象,用于管理內存分配和釋放。

ngx_array_t 的設計充分利用了 Nginx 的內存池機制,避免了頻繁的內存分配和釋放操作,從而提高了性能。

?

    array->size = size;

size 參數賦值給 array->size,表示數組中每個元素的大小

    array->nalloc = n;

?將 n 參數賦值給 array->nalloc,表示數組預分配的元素數量

    array->pool = pool;

?將 pool 參數賦值給 array->pool,表示數組使用的內存池

    array->elts = ngx_palloc(pool, n * size);

?作用 :調用 ngx_palloc 函數,從內存池中分配一塊大小為 n * size 的連續內存,并將其地址賦值給 array->elts

n * size 表示需要分配的總內存大小。

ngx_palloc 是 Nginx 內存池的核心函數,用于從內存池中分配內存。

    if (array->elts == NULL) {return NGX_ERROR;}

?作用 :檢查 array->elts 是否為 NULL,如果是,則返回 NGX_ERROR 表示初始化失敗。

如果內存分配失敗,數組無法正常工作,因此需要立即終止初始化過程。

返回 NGX_ERROR 可以讓調用者知道初始化失敗的原因。

    return NGX_OK;
}
作用 :如果所有步驟都成功執行,則返回 NGX_OK 表示初始化完成。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/896175.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/896175.shtml
英文地址,請注明出處:http://en.pswp.cn/news/896175.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室

開源項目 botgroup.chat 介紹 AI 多人聊天室: 一個基于 React 和 Cloudflare Pages(免費一鍵部署) 的多人 AI 聊天應用,支持多個 AI 角色同時參與對話,提供類似群聊的交互體驗。體驗地址:https://botgroup.chat 開源倉庫&#x…

GPU和FPGA的區別

GPU(Graphics Processing Unit,圖形處理器)和 FPGA(Field-Programmable Gate Array,現場可編程門陣列)不是同一種硬件。 我的理解是,雖然都可以用于并行計算,但是GPU是純計算的硬件…

詳解單例模式、模板方法及項目和源碼應用

大家好,我是此林。 設計模式為解決特定問題提供了標準化的方法。在項目中合理應用設計模式,可以避免重復解決相同類型的問題,使我們能夠更加專注于具體的業務邏輯,減少重復勞動。設計模式在定義系統結構時通常考慮到未來的擴展。…

高清下載油管視頻到本地

下載工具并安裝: yt-dlp官網地址: GitHub - yt-dlp/yt-dlp: A feature-rich command-line audio/video downloader ffmpeg官網地址: Download FFmpeg 注:記住為其添加環境變量 操作命令: 該指令表示以720p碼率下載VIDEO_UR…

Docker掛載數據顯式掛載和隱式掛載的區別

項目使用的Docker file 創建數據卷掛載點,結果發現宿主機目錄中的數據卷路徑下是空的,才知道docker file中創建的數據卷是隱式掛載,并不會在宿主機上留下持久化數據,隨著容器被刪除隱式掛載的數據卷也會跟著被刪除 后面改為在jen…

IOS UITextField 無法隱藏鍵盤問題

設置UITextField 鍵盤按鈕返回鍵為“完成”,即return key 設置done .m代碼設置代理 //設置代理協議 UITextFieldDelegate, self.mobileTextField.delegate self; ///點擊完成鍵隱藏鍵盤 - (BOOL)textFieldShouldReturn:(UITextField *)textField{//取…

【深度學習】Unet的基礎介紹

U-Net是一種用于圖像分割的深度學習模型,特別適合醫學影像和其他需要分割細節的任務。如圖: Unet論文原文 為什么叫U-Net? U-Net的結構像字母“U”,所以得名。它的結構由兩個主要部分組成: 下采樣(編碼…

RT-Thread+STM32L475VET6實現定時器定時功能

文章目錄 前言一、板載資源介紹二、具體步驟1.打開STM32CubeMX進行相關配置1.1 使用外部高速時鐘,并修改時鐘樹1.2 打開定時器(定時器根據自己需求調整)1.3 打開串口1.4 生成工程 2. 配置定時器2.1 打開HWTIMER設備驅動2.2 聲明定時器2.3將stm32l4xx_hal_msp.c中HAL…

Linux /etc/fstab文件詳解:自動掛載配置指南(中英雙語)

Linux /etc/fstab 文件詳解:自動掛載配置指南 在 Linux 系統中,/etc/fstab(File System Table)是一個至關重要的配置文件,它用于定義系統開機時自動掛載的文件系統。如果你想讓磁盤分區、遠程存儲(如 NFS&…

鏈表-基礎訓練(二)鏈表 day14

兩兩交換鏈表中的節點 題目示意: 給定一個鏈表,兩兩交換其中相鄰的節點,并返回交換后的鏈表。 你不能只是單純的改變節點內部的值,而是需要實際的進行節點交換。 原先我的思路是圖像上的思路,但是我感覺還是很復雜…

Unity游戲制作中的C#基礎(4)數組聲明和使用

一、數組的聲明 在 C# 中,聲明數組有多種方式,每種方式都有其適用的場景,下面為你逐一詳細介紹: 1. 直接初始化聲明 這種方式直觀且便捷,在聲明數組的同時就為其賦初值,讓數組從誕生之初就擁有了具體的數據…

【Gin-Web】Bluebell社區項目梳理5:投票功能分析與實現

本文目錄 一、投票功能投票流程實現代碼redis投票 一、投票功能 投票流程 首先我們要明確,就是 誰(哪個用戶:userID) 給 哪個帖子(postID) 投了 什么票(贊成票or反對票)。 贊成票…

XUnity.AutoTranslator-deepseek——調用騰訊的DeepSeek V3 API,實現Unity游戲中日文文本的自動翻譯

XUnity.AutoTranslator-deepseek 本項目通過調用騰訊的DeepSeek V3 API,實現Unity游戲中日文文本的自動翻譯。 準備工作 1. 獲取API密鑰 訪問騰訊云API控制臺申請DeepSeek的API密鑰(限時免費)。也可以使用其他平臺提供的DeepSeek API。 …

Python爬蟲-批量爬取股票數據貓各股票代碼

前言 本文是該專欄的第47篇,后面會持續分享python爬蟲干貨知識,記得關注。 本文筆者以股票數據貓為例子,基于Python爬蟲,批量獲取各股票代碼數據。 具體實現思路和詳細邏輯,筆者將在正文結合完整代碼進行詳細介紹。廢話不多說,下面跟著筆者直接往下看正文詳細內容。(附…

《Keras 3 :使用 Vision Transformers 進行物體檢測》:此文為AI自動翻譯

《Keras 3 :使用 Vision Transformers 進行物體檢測》 作者:Karan V. Dave 創建日期:2022 年 3 月 27 日最后修改時間:2023 年 11 月 20 日描述:使用 Vision Transformer 進行對象檢測的簡單 Keras 實現。 (i) 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 介紹 A…

vue-treeselect顯示unknown的問題及解決

問題 解決辦法 去node-modules包里面找到這個組件的源碼,在它dist文件里面找到這個文件,然后搜索unknown,把它刪掉就可以解決了。

深入剖析抽象工廠模式:設計模式中的架構利器

深入剖析抽象工廠模式:設計模式中的架構利器 在軟件開發領域,設計模式是解決常見問題的通用方案,而抽象工廠模式作為創建型設計模式的重要一員,在構建復雜軟件系統時發揮著關鍵作用。它為創建一系列相關或相互依賴的對象提供了一…

python獲取網頁內容 靠譜的做法

獲取網頁內容 response requests.get(url, verifyFalse) 通過這種方式下載網址不太靠譜, 容易出 ssl錯誤 requests.exceptions.SSLError: HTTPSConnectionPool(hostagri.hainan.gov.cn, port443): Max retries exceeded with url: /hnsnyt/xxgk/gfxwj/index_1.html (Caused by…

MFC中CString的Format、與XML中的XML_SETTEXT格式化注意

1、在MFC中導入 "msxml6.dll",并使用其中的XML_SETTEXT函數,此調用在進行格式化的時候,調用的還是CString.Format()函數! 2、用double類型的數據,格式化整形數%d之前,必須將double強轉為int&…

Linux-C-函數棧-SP寄存器

sp(Stack Pointer,棧指針)是計算機體系結構中一個非常重要的寄存器,下面將詳細介紹其作用和原理。 作用 1. 管理棧內存 棧是一種后進先出(LIFO,Last In First Out)的數據結構,在程…