當前位置:首頁 » 編程軟體 » 編譯時與函數調用的差別

編譯時與函數調用的差別

發布時間: 2022-06-08 13:43:05

A. 內聯函數與普通函數比較,在聲明、編譯時有什麼不同

在類聲明的內部聲明或定義的成員函數叫做內聯(INLINE)函數.
引入內聯函數的目的是為了解決程序中函數調用的效率問題。
在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由於在編譯時將函數體中的代碼被替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間代銷上不象函數調用時那麼大,可見它是以目標代碼的增加為代價來換取時間的節省。
在程序中,調用其函數時,該函數在編譯時被替代,而不是像一般函數那樣是在運行時被調用。

函數調用也會帶來降低效率的問題,因為調用函數實際上將程序執行順序轉移到函數所存放在內存中某個地址,將函數的程序內容執行完後,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢復現場,並按原來保存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函數體代碼不是很大,但又頻繁地被調用的函數來講,解決其效率問題更為重要。引入內聯函數實際上就是為了解決這一問題。

B. 內聯函數與c語言函數調用有什麼區別

首先講一下函數調用,C語言函數調用的過程是:
①將參數壓棧,一般是從右往左。
②使用call指令,調用函數。call指令會將當前指令所在的內存位置壓棧以便函數結束後返回。
③進入函數體(跳轉到另一塊內存中),執行,執行完後,使用通用寄存器或者棧來存儲返回值,使用ret指令返回。
可以看到,函數調用是發生了跳轉的,考慮一下跳轉大小和指令預取這些東西,調用函數會加長執行時間。如果只是調用幾次,時間差異可能感覺不出來,不是特別情況也不需要在乎。但函數被反復調用時,性能就會差很多。
所以有了內聯函數這玩意,編譯器會直接將對內聯函數的調用擴展為整個函數的代碼(幾種情況除外,這個看書,我也記不住),也就是說,不會使用call和ret指令。所以,這樣做的缺點就是每個調用函數的位置都被擴展成了函數的代碼,會加大生成的可執行文件的大小。所以才會提倡,將調用頻繁而函數本身卻很小的函數聲明為內聯函數。
它們的區別就在這里,跳轉和不跳轉,犧牲時間還是犧牲空間。

C. C語言的函數調用和oc的消息機制有什麼區別

1對於C語言,函數的調用在編譯器的時候決定調用那個函數。編譯完之後直接順序執行。
2OC的函數調用成為消息發送。屬於動態調用過程。在編譯的時候決不能決定真正調用那個函數(實時證明,在編譯階段,oc可以調用任何函數,及時這個函數並未實現,只要申明過就不會報錯,而c語言在編譯階段或報錯)。

D. 1. 編譯時的多態性與運行時的多態性有什麼區別,他們的實現方法有什麼不同

多態從實現的角度可以劃為兩類:編譯時多態和運行時多態。

編譯時的多態性:就是在程序編譯的時候,也就是生成解決方案的時候就決定要實現什麼操作。

運行時的多態性:就是指直到系統運行時,才根據實際情況決定實現何種操作。

1、多態實現形式不同:

編譯時的多態是通過靜態連編來實現的;運行時的多態是用動態連編來實現的。

2、多態性通過方式不同:

編譯時的多態性主要是通過函數重載和運算符重載來實現的;運行時的多態性主要是通過虛函數來實現的。

(4)編譯時與函數調用的差別擴展閱讀:

靜態多態性又稱編譯時的多態性。靜態多態性的函數調用速度快、效率高但缺乏靈活性,在程序運行前就應決定執行的函數和方法。

動態多態性的特點是:不在編譯時確定調用的是哪個函數,而是在程序運行過程中才動態地確定操作所針對的對象。又稱運行時的多態性。動態多態性是通過虛函數(virtual function)實現的。

E. 1.linux系統調用和庫函數調用的區別

系統調用:是操作系統為用戶態運行的進程和硬體設備(如CPU、磁碟、列印機等)進行交互提供的一組介面,即就是設置在應用程序和硬體設備之間的一個介面層。可以說是操作系統留給用戶程序的一個介面。再來說一下,linux內核是單內核,結構緊湊,執行速度快,各個模塊之間是直接調用的關系。放眼望整個linux系統,從上到下依次是用戶進程->linux內核->硬體。其中系統調用介面是位於Linux內核中的,如果再稍微細分一下的話,整個linux系統從上到下可以是:用戶進程->系統調用介面->linux內核子系統->硬體,也就是說Linux內核包括了系統調用介面和內核子系統兩部分;或者從下到上可以是:物理硬體->OS內核->OS服務->應用程序,其中操作系統起到「承上啟下」的關鍵作用,向下管理物理硬體,向上為操作系服務和應用程序提供介面,這里的介面就是系統調用了。
一般地,操作系統為了考慮實現的難度和管理的方便,它只提供一少部分的系統調用,這些系統調用一般都是由C和匯編混合編寫實現的,其介面用C來定義,而具體的實現則是匯編,這樣的好處就是執行效率高,而且,極大的方便了上層調用。
庫函數:顧名思義是把函數放到庫里。是把一些常用到的函數編完放到一個文件里,供別人用。別人用的時候把它所在的文件名用#include<>加到裡面就可以了。一般是放到lib文件里的。一般是指編譯器提供的可在c源程序中調用的函數。可分為兩類,一類是c語言標准規定的庫函數,一類是編譯器特定的庫函數。(由於版權原因,庫函數的源代碼一般是不可見的,但在頭文件中你可以看到它對外的介面)
libc中就是一個C標准庫,裡面存放一些基本函數,這些基本函數都是被標准化了的,而且這些函數通常都是用匯編直接實現的。
庫函數一般可以概括的分為兩類,一類是隨著操作系統提供的,另一類是由第三方提供的。隨著系統提供的這些庫函數把系統調用進行封裝或者組合,可以實現更多的功能,這樣的庫函數能夠實現一些對內核來說比較復雜的操作。比如,read()函數根據參數,直接就能讀文件,而背後隱藏的比如文件在硬碟的哪個磁軌,哪個扇區,載入到內存的哪個位置等等這些操作,程序員是不必關心的,這些操作裡面自然也包含了系統調用。而對於第三方的庫,它其實和系統庫一樣,只是它直接利用系統調用的可能性要小一些,而是利用系統提供的API介面來實現功能(API的介面是開放的)。部分Libc庫中的函數的功能的實現還是藉助了系統掉調用,比如printf的實現最終還是調用了write這樣的系統調用;而另一些則不會使用系統調用,比如strlen,
strcat,
memcpy等。
實時上,系統調用所提供給用戶的是直接而純粹的高級服務,如果想要更人性化,具有更符合特定情況的功能,那麼就要我們用戶自己來定義,因此就衍生了庫函數,它把部分系統調用包裝起來,一方面把系統調用抽象了,一方面方便了用戶級的調用。系統調用和庫函數在執行的效果上很相似(當然庫函數會更符合需求),但是系統調用是運行於內核狀態;而庫函數由用戶調用,運行於用戶態。
系統調用是為了方便使用操作系統的介面,而庫函數則是為了人們編程的方便。

F. c++ 函數調用和直接展開為什麼差別這么大

這個主要和代碼底層原理有關,函數調用被編譯器編譯後,會比代碼展開(內聯或者宏調用)多個跳轉指令,也就是代碼執行要從一個內存位置跳轉到另一個位置去執行;函數調用還有另外的性能開銷,那就是函數棧,函數調用需要開辟出棧空間,還要對函數參數進行壓棧、出棧操作。關鍵的問題是,如果只是進行一次函數調用,所有的這些性能開銷加起來,和代碼展開相比其實也沒有什麼差別(性能測試除外),但是需要代碼展開的都是要反復、多次調用執行的小代碼段,多次的執行相比起來函數調用和代碼展開的性能差別就很大了。

G. 系統調用和一般的函數調用的區別

系統調用和一般的函數調用的區別 有很多 大家慢慢總結吧
系統調用 是系統預先留好的介面 用戶實現 共系統調用

比如 窗口的回調函數等等 還有 windows的shell 擴展 等

H. 請問C語言中函數定義,函數聲明和函數調用的區別

樓主可以這樣想,C語言中,無論是常量,變數,函數,只有先定義才能使用的。在函數定義時,大腦要往一般的常量,變數定義的方向,切忌先不要想函數的別的。定義好後,把函數的定義先放一邊,不管它。
接著是函數聲明,大家都知道,C語言是有一個主函數main()和0或n個普通函數組成的。由於當代碼越長,用到的函數就越多,為了減少函數的混淆,所以要有個函數名,就像老師點名一樣,聲明一個函數,就如點一個學生的名字。
總之,函數定義是系統要求的,不定義就錯誤,而函數聲明實際上不定義也行,但為了方便和減少錯誤,人為規定要聲明。

熱點內容
如何設置強緩存的失效時間 發布:2025-05-19 15:21:28 瀏覽:693
winxp無法訪問 發布:2025-05-19 15:19:48 瀏覽:945
文件預編譯 發布:2025-05-19 15:14:04 瀏覽:641
怎麼在伺服器上掛公網 發布:2025-05-19 15:14:02 瀏覽:270
濟南平安e通如何找回密碼 發布:2025-05-19 14:56:58 瀏覽:175
安卓手機如何找到iccid碼 發布:2025-05-19 14:46:51 瀏覽:226
編譯的內核為什麼那麼大 發布:2025-05-19 14:45:21 瀏覽:178
什麼控制壓縮 發布:2025-05-19 14:28:13 瀏覽:930
網路伺服器忙指什麼 發布:2025-05-19 14:28:10 瀏覽:188
伺服器有外網ip 發布:2025-05-19 14:02:02 瀏覽:833