FFmpeg源代碼簡單分析-通用- 內存的分配和釋放(av_malloc()、av_free()等)

參考鏈接

  • FFmpeg源代碼簡單分析:內存的分配和釋放(av_malloc()、av_free()等)_雷霄驊的博客-CSDN博客_av_malloc

內容介紹

  • 內存操作的常見函數位于libavutil\mem.c中
  • 本文記錄最常使用的幾個函數:
    • av_malloc()
    • av_realloc()
    • av_mallocz()
    • av_calloc()
    • av_free()
    • av_freep()

代碼

av_malloc()

void *av_malloc(size_t size)
{void *ptr = NULL;if (size > atomic_load_explicit(&max_alloc_size, memory_order_relaxed))return NULL;#if HAVE_POSIX_MEMALIGNif (size) //OS X on SDK 10.6 has a broken posix_memalign implementationif (posix_memalign(&ptr, ALIGN, size))ptr = NULL;
#elif HAVE_ALIGNED_MALLOCptr = _aligned_malloc(size, ALIGN);
#elif HAVE_MEMALIGN
#ifndef __DJGPP__ptr = memalign(ALIGN, size);
#elseptr = memalign(size, ALIGN);
#endif/* Why 64?* Indeed, we should align it:*   on  4 for 386*   on 16 for 486*   on 32 for 586, PPro - K6-III*   on 64 for K7 (maybe for P3 too).* Because L1 and L2 caches are aligned on those values.* But I don't want to code such logic here!*//* Why 32?* For AVX ASM. SSE / NEON needs only 16.* Why not larger? Because I did not see a difference in benchmarks ...*//* benchmarks with P3* memalign(64) + 1          3071, 3051, 3032* memalign(64) + 2          3051, 3032, 3041* memalign(64) + 4          2911, 2896, 2915* memalign(64) + 8          2545, 2554, 2550* memalign(64) + 16         2543, 2572, 2563* memalign(64) + 32         2546, 2545, 2571* memalign(64) + 64         2570, 2533, 2558** BTW, malloc seems to do 8-byte alignment by default here.*/
#elseptr = malloc(size);
#endifif(!ptr && !size) {size = 1;ptr= av_malloc(1);}
#if CONFIG_MEMORY_POISONINGif (ptr)memset(ptr, FF_MEMORY_POISON, size);
#endifreturn ptr;
}
  • 如果不考慮上述代碼中的一大堆宏定義
  • av_malloc()的代碼可以簡化成如下形式
  • 可以看出,此時的av_malloc()就是簡單的封裝了系統函數malloc(),并做了一些錯誤檢查工作
void *av_malloc(size_t size)
{void *ptr = NULL;/* let's disallow possibly ambiguous cases */if (size > (max_alloc_size - 32))return NULL;ptr = malloc(size);if(!ptr && !size) {size = 1;ptr= av_malloc(1);}return ptr;
}

av_realloc()

void *av_realloc(void *ptr, size_t size)
{void *ret;if (size > atomic_load_explicit(&max_alloc_size, memory_order_relaxed))return NULL;#if HAVE_ALIGNED_MALLOCret = _aligned_realloc(ptr, size + !size, ALIGN);
#elseret = realloc(ptr, size + !size);
#endif
#if CONFIG_MEMORY_POISONINGif (ret && !ptr)memset(ret, FF_MEMORY_POISON, size);
#endifreturn ret;
}
  • 默認情況下的代碼:
  • 可以看出av_realloc()簡單封裝了系統的realloc()函數。
  • C 庫函數 – realloc() | 菜鳥教程
void *av_realloc(void *ptr, size_t size)
{/* let's disallow possibly ambiguous cases */if (size > (max_alloc_size - 32))return NULL;return realloc(ptr, size + !size);
}

av_mallocz()

void *av_mallocz(size_t size)
{void *ptr = av_malloc(size);if (ptr)memset(ptr, 0, size);return ptr;
}
  • av_mallocz()可以理解為av_malloc()+zeromemory
  • av_mallocz()中調用了av_malloc()之后,又調用memset()將分配的內存設置為0

av_calloc()

void *av_calloc(size_t nmemb, size_t size)
{size_t result;if (size_mult(nmemb, size, &result) < 0)return NULL;return av_mallocz(result);
}
static int size_mult(size_t a, size_t b, size_t *r)
{size_t t;#if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_mul_overflow)if (__builtin_mul_overflow(a, b, &t))return AVERROR(EINVAL);
#elset = a * b;/* Hack inspired from glibc: don't try the division if nelem and elsize* are both less than sqrt(SIZE_MAX). */if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b)return AVERROR(EINVAL);
#endif*r = t;return 0;
}
  • av_calloc()則是簡單封裝了av_mallocz()?
  • 從代碼中可以看出,它調用av_mallocz()分配了nmemb*size個字節的內存。

av_free()

void av_free(void *ptr)
{
#if HAVE_ALIGNED_MALLOC_aligned_free(ptr);
#elsefree(ptr);
#endif
}
  • 可以看出av_free()簡單的封裝了free()?

av_freep()

void av_freep(void *arg)
{void *val;memcpy(&val, arg, sizeof(val));memcpy(arg, &(void *){ NULL }, sizeof(val));av_free(val);
}
  • av_freep()簡單封裝了av_free()。并且在釋放內存之后將目標指針設置為NULL。
  • C 庫函數 – memcpy() | 菜鳥教程?

補充知識

內存對齊

  • 參考鏈接:計算機中的內存對齊與大小端 | MuYi's Blog
  • 程序員通常認為內存就是一個字節數組,每次可以一個一個字節存取內存。例如在C語言中使用char *指代“一塊內存”,Java中使用byte[]指代一塊內存。如下所示。

  • 但那實際上計算機處理器卻不是這樣認為的。處理器相對比較“懶惰”,它以塊為單位進行數據的讀取,塊的大小可以是2字節,4字節,8字節,16字節甚至32字節來存取內存。例如下圖顯示了以4字節為單位讀寫內存的處理器“看待”上述內存的方式。

  • 上述的存取單位的大小稱之為內存存取粒度。
  • 下面看一個實例,分別從地址0,和地址1讀取4個字節到寄存器。
  • 從程序員的角度來看,讀取方式如下圖所示。

  • 而2字節存取粒度的處理器的讀取方式如下圖所示。

  • 可以看出2字節存取粒度的處理器從地址0讀取4個字節一共讀取2次;從地址1讀取4個字節一共讀取了3次。
  • 存儲的時候也是將2個字節作為數據塊的大小進行存儲
  • 由于每次讀取的開銷是固定的,因此從地址1讀取4字節的效率有所下降。
  • 4字節存取粒度的處理器的讀取方式如下圖所示。

  • 可以看出4字節存取粒度的處理器從地址0讀取4個字節一共讀取1次;從地址1讀取4個字節一共讀取了2次。從地址1讀取的開銷比從地址0讀取多了一倍。
  • 由此可見內存不對齊對CPU的性能是有影響的。

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

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

相關文章

面試題——死鎖的實現

public class DeadLock {public static Object Chopstick_1 new Object();public static Object Chopstick_2 new Object();public static void main(String[] args) {final DeadLock deadLock new DeadLock();// 第一個線程 new Thread(new Runnable() {public void run()…

python回歸分析實驗_python線性回歸實驗

實驗算法python線性回歸實驗【實驗名稱】Python線性回歸實驗【實驗要求】掌握Python線性回歸模型應用過程&#xff0c;根據模型要求進行數據預處理&#xff0c;建模&#xff0c;評價與應用&#xff1b;【背景描述】線性回歸是利用數理統計中回歸分析&#xff0c;來確定兩種或兩…

FFmpeg源代碼簡單分析-通用-結構體分析-AVFormatContext

參考鏈接 FFMPEG結構體分析&#xff1a;AVFormatContext_雷霄驊的博客-CSDN博客_avformatcontext AVFormatContext AVFormatContext是包含碼流參數較多的結構體結構體的定義位于libavformat/avformat.h/*** Format I/O context.//格式化 I/O 上下文* New fields can be added…

log4j詳解與實戰

log4j詳解與實戰 http://www.iteye.com/topic/378077

plsql如何顯示表結構圖_【論文攻略】排版技巧——如何用 Word 編輯參考文獻

每個需要寫畢業論文的朋友都會發現&#xff0c;修改文獻是一件非常痛苦的事情&#xff0c;雖然現在也有很多軟件可以編排參考文獻&#xff0c;其實 word 本身就可以。采用合適的編輯方法會方便地做到整齊,規范, 自動排序和交叉引用。 1. 以尾注的方式插入第一個參考文獻將光標定…

FFmpeg源代碼簡單分析-通用-結構體分析-AVCodecContext

參考鏈接 FFMPEG結構體分析&#xff1a;AVCodecContext_雷霄驊的博客-CSDN博客_avcodeccontext AVCodecContext AVCodecContext是包含變量較多的結構體&#xff08;感覺差不多是變量最多的結構體&#xff09;結構體的定義位于avcodec.h關鍵的變量如下所示&#xff08;僅僅考慮…

Hello OpenGL——OpenGL在Visual c++6.0安裝和配置

1、下載并安裝glut庫opengl的glut庫 GLUT不是OpenGL所必須的&#xff0c;但它會給我們的學習帶來一定的方便&#xff0c;推薦安裝。 Windows環境下的GLUT下載地址&#xff1a;&#xff08;大小約為150k&#xff09; http://www.opengl.org/resources/libraries/glut/glutdlls37…

FFmpeg源代碼簡單分析-通用-結構體分析-AVIOContext

參考鏈接 FFMPEG結構體分析&#xff1a;AVIOContext_雷霄驊的博客-CSDN博客_aviocontext AVIOContext AVIOContext是FFMPEG管理輸入輸出數據的結構體結構體的定義位于位于avio.h關鍵的變量如下所示 unsigned char *buffer&#xff1a;緩存開始位置int buffer_size&#xff1…

初聞動態規劃

前言 本文以一道常見的算法面試題開篇&#xff0c;引入動態規劃的基礎概念&#xff0c; 介紹其思考過程。 正文 一、常見的一道算法面試題——上臺階 有一個樓梯總共n個臺階&#xff0c;只能往上走&#xff0c;每次只能上1個、2個臺階&#xff0c;總共有多少種走法。 解決…

FFmpeg源代碼簡單分析-通用-結構體分析-AVCodec

參考鏈接 FFMPEG結構體分析&#xff1a;AVCodec_雷霄驊的博客-CSDN博客_avcodec AVCodec AVCodec是存儲編解碼器信息的結構體結構體的定義位于avcodec.h文件中最主要的幾個變量 const char *name&#xff1a;編解碼器的名字&#xff0c;比較短const char *long_name&#xff…

SLF4J簡介與使用(整合log4j)

SLF4J簡介與使用(整合log4j) 一、概念 SLF4J的全稱是Simple Logging Facade for Java&#xff0c;即簡單日志門面。SLF4J并不是具體的日志框架&#xff0c;而是作為一個簡單門面服務于各類日志框架&#xff0c;如java.util.logging, logback和log4j。 SLF4J提供了統一的記錄…

multism中ui和uo應該怎么表示_王者榮耀:夢淚直播時談到體驗服大改動,表示裝備的改動很關鍵...

王者榮耀的主播夢淚&#xff0c;大家都很熟了&#xff0c;也是一個很強的主播&#xff0c;他對于王者榮耀的理解&#xff0c;還是非常深刻的&#xff0c;而最近王者榮耀的體驗服&#xff0c;進行了大改動&#xff0c;也是改變了很多的東西。對此&#xff0c;網友們也是非常的在…

FFmpeg源代碼簡單分析-通用-結構體分析-AVStream

參考鏈接 FFMPEG結構體分析&#xff1a;AVStream_雷霄驊的博客-CSDN博客_avstream AVStream AVStream是是存儲每一個視頻/音頻流信息的結構體結構體的定義位于avformat.h重要參數介紹 int index&#xff1a;標識該視頻/音頻流AVCodecContext *codec&#xff1a;指向該視頻/音…

在Windows下安裝JDK的通常步驟

獲取安裝包 從官網或其他途徑下載JDK的Windows版本的安裝包&#xff0c;并點擊安裝。安裝向導中無需選擇配置項&#xff0c;默認操作即可&#xff0c;除了自定義的JDK安裝目錄。假設JDK的安裝目錄為C:\Program Files\Java。 設置環境變量 右擊桌面上的計算機&#xff0c;在菜單…

怎么關閉或者卸載ivanti_電腦軟件卸載不了怎么辦,教您解決電腦軟件無法卸載方法技巧...

我們在使用電腦的過程中&#xff0c;肯定會安裝各種軟件&#xff0c;但是一些軟件在使用完之后就不會再使用了&#xff0c;但又無法卸載。下面由小編分享一下電腦安裝的軟件無法卸載解決方法&#xff0c;如果你在某卸載軟件的時候出現無法卸載的情況&#xff0c;不妨通過以下方…

FFmpeg源代碼簡單分析-通用-結構體分析-AVPacket

參考鏈接 FFMPEG結構體分析&#xff1a;AVPacket_雷霄驊的博客-CSDN博客_avpacket AVPacket AVPacket是存儲壓縮編碼數據相關信息的結構體結構體的定義位于packet.h重要參數介紹 uint8_t *data&#xff1a;壓縮編碼的數據。例如對于H.264來說。1個AVPacket的data通常對應一個…

h5支付不能打開支付寶 ios_iOS WKWebview中無法調起支付寶/微信客戶端支付問題的解決方法...

這兩個的解決思路都是要在下面這個方法中先攔截相應的url&#xff0c;再單獨處理- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;支付寶…

解決Github圖片加載失敗

問題描述 瀏覽自己Github某倉庫的README.md內時&#xff0c;發現文檔的圖片始終加載不出&#xff0c;打開瀏覽器后臺&#xff0c;冒出一片紅&#xff0c;Failed to load resource: net::ERR_CONNECTION_RESET&#xff0c;如下圖所示&#xff1a; 問題分析 可能造成這問題的原…

FFmpeg源代碼簡單分析-通用-結構體分析-AVFrame

參考鏈接 FFMPEG結構體分析&#xff1a;AVFrame_雷霄驊的博客-CSDN博客 AVFrame AVFrame是包含碼流參數較多的結構體結構體的定義位于frame.hAVFrame結構體一般用于存儲原始數據&#xff08;即非壓縮數據&#xff0c;例如對視頻來說是YUV&#xff0c;RGB&#xff0c;對音頻來…

python 求子字符串_(6)KMP算法(求子串的位置)______字符串的匹配

問題&#xff1a;已知字符串 B 是字符串 A 的一個子串,問字符串 B 在字符串 A 的第一次出現位置.暴力方法:從 A 字符串 的每個位置開始對字符串 B 進行匹配. 這種方法根據數據的不同 復雜度不同最高可以達到O( m*n ). (m,n分別為兩個字符串的長度)KMP算法&#xff1a;我們先來看…