c語言 函數指針開銷,函數指針是否使程序變慢?

AnT..

82

您可以看到,在從性能角度來看實際上很重要的情況下,例如在一個周期中多次重復調用該函數,性能可能根本不同.

這對于人們來說可能聽起來很奇怪,他們習慣于將C代碼視為由抽象的C機器執行的,其機器語言與C語言本身密切相關.在這種情況下,"默認情況下"對函數的間接調用確實比直接調用慢,因為它正式涉及額外的內存訪問以確定調用的目標.

但是,在現實生活中,代碼由真實機器執行,并由優化編譯器編譯,該編譯器非常了解底層機器架構,這有助于它為該特定機器生成最佳代碼.在許多平臺上,可能會發現從循環執行函數調用的最有效方法實際上會導致直接和間接調用的相同代碼,從而導致兩者的相同性能.

例如,考慮x86平臺.如果我們"直接"將直接和間接調用轉換為機器代碼,我們可能最終得到類似的東西

// Direct call

do-it-many-times

call 0x12345678

// Indirect call

do-it-many-times

call dword ptr [0x67890ABC]

前者在機器指令中使用立即操作數,并且通常比后者更快,后者必須從某個獨立的存儲器位置讀取數據.

在這一點上,讓我們記住,x86架構實際上還有一種方法可以為call指令提供操作數.它在寄存器中提供目標地址.關于這種格式的一個非常重要的事情是它通常比上述兩種都快.這對我們意味著什么?這意味著一個好的優化編譯器必須并將利用這一事實.為了實現上述循環,編譯器將嘗試在兩種情況下通過寄存器使用調用.如果成功,最終代碼可能如下所示

// Direct call

mov eax, 0x12345678

do-it-many-times

call eax

// Indirect call

mov eax, dword ptr [0x67890ABC]

do-it-many-times

call eax

注意,現在重要的部分 - 循環體中的實際調用 - 在兩種情況下都完全相同.毋庸置疑,性能幾乎完全相同.

有人甚至說,但奇怪的是聽起來,這個平臺上直接調用(與立即數的調用call)是慢比只要間接調用中提供的操作數的間接調用寄存器(相存儲在內存中).

當然,在一般情況下,整個事情并不那么容易.編譯器必須處理有限的寄存器可用性,別名問題等.但是像你的例子中那樣簡單的情況(甚至在更復雜的情況下),上述優化將由一個好的編譯器執行并將完全消除循環直接調用和循環間接調用之間的性能差異.當調用虛函數時,這種優化在C++中特別有效,因為在典型的實現中,所涉及的指針完全由編譯器控制,使其充分了解別名圖片和其他相關內容.

當然,總有一個問題是你的編譯器是否足夠智能以優化這樣的事情......

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

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

相關文章

tms320c2000 c語言偽指令,TMS320F240XDSP匯編及C語言多功能控制應用(附光盤)

摘要:本書以SNF2407M實驗開發系統配合CPLD的SNDSP2407P接口,以簡易的C語言和快速的匯編語言編寫達20個以上的范例實驗及多個專題制作,主要內容如下:TMS320LF2407系列MCU的硬件架構,內存配置及指令格式和其運作功能;C2000的CC或CCS程序的編輯,編譯及除錯等操作;DSP搭…

用C語言編寫繩索運動函數,福建省教師招聘考試小學數學真題試卷

2014年福建省中小學新任教師公開招聘考試小學數學試卷(課程代碼09202)1. 本試卷滿分150分,考試時間120分鐘。2. 本試卷分為兩部分:第一部分為選擇題,第二部分為非選擇題。3. 請把所有答案涂、寫在答題卡上。不要錯位、越界答題.一、單項選擇題…

c語言 三個小球排排坐,關穎三個孩子排排坐 太萌啦

0關穎三個孩子排排坐 太萌啦2019-12-10 10:596月20日,關穎在微博上曬出三個孩子坐在墊子上的照片,配文:“Terrible two has officially started today. Happy happy birthday Phi Phi! 家庭樂趣其中一件事情 就是和小朋友不斷的唱生日歌吹蠟燭…

大學生學C語言用什么筆記本電腦,有哪些適合大學生用的筆記本電腦

高考成績公布之后又有一大波新大學生即將入學,筆記本電腦也將是大學生必不可少的一款電子數碼產品,但是現在市面上電腦繁多,又有哪些比較不錯的電腦適合新入學的大學生呢?惠普 HP Envy 13 (2019)現在,最適合學生的筆記…

android自帶下拉阻尼動畫,android 有阻尼下拉刷新列表的實現方法

本文將會介紹有阻尼下拉刷新列表的實現,先來看看效果預覽:這是下拉狀態:這是下拉松開手指后listView回滾到刷新狀態時的樣子:1. 如何調用雖然效果圖看起來樣子不太好看,主要是因為那個藍色的背景對不對,沒關…

android viewpager畫廊,Android使用ViewPager實現畫廊效果

按照國際慣例,先上效果圖其實這跟普通的ViewPager原理都一樣,需要改變的地方就是:1.增加滑進和滑出的動畫效果2.縮小ViewPager的大小,給屏幕上留出上一張和下一張視圖的空間布局文件:xmlns:android"http://schema…

excel 區間人數柱狀圖_Excel中,區間統計的3種技巧都不掌握,那就真的OUt了!

點擊上方"Excel函數公式"免費訂閱 Excel的最大功能在于數據的分析與處理,在數據分析和處理中,區間統計是非常廣泛的,各位親是怎么操作的呢?如果還不掌握,且看小編給大家帶來的“區間統計”的3種應用技巧。一…

nova8pro能升級鴻蒙嗎,華為將有48款產品可以升級到鴻蒙 2.0系統

網站Huawei Central最近報道稱,將有48款產品可以升級到鴻蒙 2.0系統,包括華為及其子品牌Honor的智能手機,平板電腦和智能手表。 Huawei Central名單中有3款未發布的手機Huawei Nova 8和Nova 8 Pro,以及Honor V40。 它們將在推出時…

patran如何看屈曲因子_校準證書中的修正值、修正因子,你真的會用嗎?

一些儀器設備校準回來會產生修正值/修正因子,然而很多實驗室小伙伴們不懂得如何正確使用這些修正值/修正因子?為幫助廣大實驗室能規范正確地使用修正值/修正因子,小析姐 特為大家推送這篇文章~【概念】修正值:為修正某一測量器具的…

android 生成debug.keystore,android sdk 如何重新生成debug.keystore

1)首先你要確定你安裝的JDK位置,Windows->Preferences->Java->Installed JREs,你可以看到是Jre的location,再在dos cmd模式下查看你當前系統的path是否已經包含了。如果沒有包含添加到當前環境參數中。因為我們要用到的keytool命令在這個目錄下呀。2)接下來…

已知a類被打包在packagea_2021考研干貨:199管理類聯考綜合邏輯歸納習題(1)

199管理類聯考綜合中的邏輯,所占分值為60分。因此,備考2021考研199管綜的考生們,需要在內容上面多下功夫復習。題目:小張夫婦想買套房子,經他一番挑選,目標鎖定某座樓的3套房。已知:這三套房子中…

凱立德手機導航(家園版) v5.3 for android,凱立德手機導航(家園版)android平臺

感謝您閱讀凱立德手機導航產品下載安裝教程,請根據以下步驟進行操作。下載安裝過程完成后,您將體驗到更為專業的凱立德導航服務。安裝前請認真閱讀以下文字:1、為了減少導航產品所占容量,本導航產品分主程序和地圖數據兩部分。下載…

android性能優化 掘金,Android性能優化之內存泄漏

內存泄漏:內存單元使用完成后未釋放,未回收。理解強弱引用和gc垃圾回收機制后,會更好的理解內存泄漏問題。在目前的Android項目中,內存泄漏是無法避免的,在編寫代碼時要是否產生了內存泄漏。內存泄露中要注意對象、變量…

clocks_per_sec 時間不正確_你該擁有的不只是護膚品,還有正確護膚時間表

同樣是護膚,為什么你的效果始終不如意?其實,不同的時間段,皮膚各司其職,都有著不同的“任務”和“狀態”。快跟芭姐一起了解一下這份《皮膚時間表》,看看如何讓護膚效果事半功倍吧!清潔是喚醒肌…

jdbc連接數據scanip_JDBC連接數據庫的四種方式:DriverManager,DataSource,DBCP,C3P0

方法1:使用java.sql.DriverManager類驅動管理器類,用于管理所有注冊的驅動程序。(注:DataSource 接口是 JDBC 2.0 API 中的新增內容,它提供了連接到數據源的另一種方法。使用 DataSource 對象是連接到數據源的首選方法。)常用的兩…

HTML下拉菜單怎么做成橫向,css導航條橫向帶下拉菜單

cssdiv導航下拉二級菜單豎排效果如何改為橫排?,在“下一站”有三個二級豎排菜單,如何能變為橫排?困擾了我一天了,讓二級菜單變成一行,只需要在豎排的效果上,讓二級菜單都浮動起來,這…

java移動端接口測試_使用java如何進行接口測試

關于接口測試, 我們之前介紹過很多方法了, 有postman, soapUI, Jmeter等, 他們各有優勢和劣勢, 今天和大家分享的是如何用java TestNG來實現接口測試.開始測試之前需要如下準備工作:1. IDE環境, Intellij 或者eclipse, 個人推薦使用Intellij.2. JKD1.8 以上3. Maven 環境 Maven…

html5折疊卡片,基于HTML5折疊卡片式下拉菜單代碼

基于HTML5折疊卡片式下拉菜單代碼。這是一款基于jQueryCSS3HTML5實現的下拉列表框特效代碼。效果圖如下:實現的代碼。hmtl代碼:愛編程愛編程 jQuery特效 CSS3特效 HTML5特效 音效下載 flash動畫js代碼:(function ($) {var cards $(.card-dro…

fastexcel讀取excel追加寫入sheet頁_python筆記52:python操作excel

主要內容:小目標:掌握excel模塊主要內容:excel相關模塊,openpyxl安裝使用如果看完這篇文章,你還是弄不明excel相關操作; 你來找我,我保證不打你,我給你發100的大紅包。1. excel相關操…

HTML音樂播放沒聲音,網頁沒有聲音但系統顯示有聲音怎么回事?如何解決?

網友提問:為什么網頁沒有聲音,除了迅雷高清在線影院的視頻有聲音和本已經下載的歌或視頻有聲音外,其他網頁都沒有聲音!就是網頁沒聲音,其他一切正常!網頁沒有聲音但系統顯示有聲音;網頁在線視頻…