ios 行內函數 inline ---分解LFLiveKit
阿新 • • 發佈:2018-11-12
/* 行內函數:用 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