1. 程式人生 > >ios 行內函數 inline ---分解LFLiveKit

ios 行內函數 inline ---分解LFLiveKit

/*
 行內函數:用 inline 關鍵字修飾的函式。行內函數不是在函式呼叫時發生控制轉移,類似於《巨集》在編譯時將函式體替換每一個呼叫的程式碼位置。
 
 相較於普通函式:
 1、普通函式(沒有inline修飾)彙編時會出現Call指令,而呼叫Call指令需要
 2、函式之間的呼叫實則記憶體地址之間的呼叫,當函式呼叫執行完畢後會返回到原來執行函式的地址,所有函式呼叫有一定的時間開銷。
    行內函數減少了呼叫開銷,提高了效率(執行速度較普通函式快一些)
 3、集成了巨集的優點(函式支援用巨集程式碼替換)
 
 相較於巨集:
 1、避免了巨集需要的預編譯,inline修飾的函式也是函式,不需要預編譯
 2、可以使用當前類的私有成員@private及保護成員@protected
 3、在呼叫一個行內函數時會對引數進行校驗,保證呼叫正確。
 
 看一個問題分兩面:
 1、行內函數只是我們向編譯器提供的申請,編譯器不一定採用inline的形式呼叫
 2、行內函數無法承載大量、複雜程式碼,否則有可能抵消高效率的好處
 3、行內函數你不允許使用迴圈語句和開關 (for、while等)
 4、行內函數必須定義在呼叫之前
 
 
*/ inline static NSString *formatedSpeed(float bytes, float elapsed_milli) { if (elapsed_milli <= 0) { return @"N/A"; } if (bytes <= 0) { return @"0 KB/s"; } float bytes_per_sec = ((float)bytes) * 1000.f / elapsed_milli; if (bytes_per_sec >= 1000 * 1000) {
return [NSString stringWithFormat:@"%.2f MB/s", ((float)bytes_per_sec) / 1000 / 1000]; } else if (bytes_per_sec >= 1000) { return [NSString stringWithFormat:@"%.1f KB/s", ((float)bytes_per_sec) / 1000]; } else { return [NSString stringWithFormat:@"%ld B/s", (long)bytes_per_sec]; } }

 

    NSLog(@"debugInfo uploadSpeed: %@", formatedSpeed(debugInfo.currentBandwidth, debugInfo.elapsedMilli));

 

參考:

https://www.jianshu.com/p/d557b0831c6a

https://www.cnblogs.com/iosshare/archive/2016/05/11/5483330.html