1. 程式人生 > >[隨筆]不要問我fastcall是什麼

[隨筆]不要問我fastcall是什麼

__stdcall、__cdcel和__fastcall三者的區別

  __stdcall、__cdecl和__fastcall是三種函式呼叫協議,函式呼叫協議會影響函式引數的入棧方式、棧內資料的清除方式、編譯器函式名的修飾規則等。

呼叫協議常用場合
  __stdcall:Windows API預設的函式呼叫協議。
  __cdecl:C/C++預設的函式呼叫協議。
  __fastcall:適用於對效能要求較高的場合。

函式引數入棧方式
  __stdcall:函式引數由右向左入棧。
  __cdecl:函式引數由右向左入棧。
  __fastcall:從左開始不大於4位元組的引數放入CPU的ECX和EDX暫存器,其餘引數從右向左入棧。
  問題一:__fastcall在暫存器中放入不大於4位元組的引數,故效能較高,適用於需要高效能的場合。

棧內資料清除方式
  __stdcall:函式呼叫結束後由被呼叫函式清除棧內資料。
  __cdecl:函式呼叫結束後由函式呼叫者清除棧內資料。
  __fastcall:函式呼叫結束後由被呼叫函式清除棧內資料。
  問題一:不同編譯器設定的棧結構不盡相同,跨開發平臺時由函式呼叫者清除棧內資料不可行。
  問題二:某些函式的引數是可變的,如printf函式,這樣的函式只能由函式呼叫者清除棧內資料。
  問題三:由呼叫者清除棧內資料時,每次呼叫都包含清除棧內資料的程式碼,故可執行檔案較大。

C語言編譯器函式名稱修飾規則
  __stdcall:編譯後,函式名被修飾為“

[email protected]”。
  __cdecl:編譯後,函式名被修飾為“_functionname”。
  __fastcall:編譯後,函式名給修飾為“@[email protected]”。
  注:“functionname”為函式名,“number”為引數位元組數。
  注:函式實現和函式定義時如果使用了不同的函式呼叫協議,則無法實現函式呼叫。

C++語言編譯器函式名稱修飾規則
  __stdcall:編譯後,函式名被修飾為“[email protected]@YG******@Z”。
  __cdecl:編譯後,函式名被修飾為“[email protected]

@YA******@Z”。
  __fastcall:編譯後,函式名被修飾為“[email protected]@YI******@Z”。
  注:“**”為函式返回值型別和引數型別表。
  注:函式實現和函式定義時如果使用了不同的函式呼叫協議,則無法實現函式呼叫。
  C語言和C++語言間如果不進行特殊處理,也無法實現函式的互相呼叫。
  

itxiebo
20160611

相關推薦

[隨筆]不要fastcall是什麼

__stdcall、__cdcel和__fastcall三者的區別   __stdcall、__cdecl和__fastcall是三種函式呼叫協議,函式呼叫協議會影響函式引數的入棧方式、棧內資料的清除方式、編譯器函式名的修飾規則等。 呼叫協議

面試官,求求你不要這麼簡單但又刁難的演算法題了

有時候面試官往往會問我們一些簡單,但又刁難的問題,主要是看看你對問題的處理思路。如果你沒接觸過這些問題,可能一時之間還真不知道怎麼處理才比較好,這種題更重要的是一種思維的散發吧,今天就來分享幾道題面試中遇到的演算法題(當然,不是我自己遇到過,是別人遇到過,我挑選出來的) 案例1 題目描述:求1+2+3+..

【終結篇】不要程序員該如何提高了……

互聯 還要 了解 但是 這就是 指揮 容易 程序 自己 已經工作了的程序員該如何提高自己?我看到過很多說法,包括但不限於: 多讀書,然後各種書單,技術的、管理的,情商的、智商的,文學的、藝術的…… 鍛煉健身,身體是革命的本錢嘛! 寫博客,這個@dudu應該最喜歡了 多交朋

拜託!面試請不要Spring Cloud底層原理

歡迎關注微信公眾號:石杉的架構筆記(id:shishan100) 每週一三五,精品技術文章準時送上! 目錄 一、業務場景介紹 二、Spring Cloud核心元件:Eureka 三、Spring Cloud核心元件:Feign 四、Spring Cloud核心元件:Ribbon 五、Sp

拜託,面試請不要TCC分散式事務的實現原理!

往期文章 1、 拜託!面試請不要再問我Spring Cloud底層原理 2、 【雙11狂歡的背後】微服務註冊中心如何承載大型系統的千萬級訪問? 3、 【效能優化之道】每秒上萬併發下的Spring Cloud引數優化實戰 4、 微服務架構如何保障

拜託,面試請不要Redis分散式鎖的實現原理!【石杉的架構筆記】

歡迎關注個人公眾號:石杉的架構筆記(ID:shishan100) 週一至五早8點半!精品技術文章準時送上! 目錄 一、寫在前面 二、Redisson實現Redis分散式鎖的底層原理       (1)加鎖機制       (2)鎖互斥機制  

拜託,面試請不要Redis分散式鎖的實現原理!

目錄 一、寫在前面 二、Redisson實現Redis分散式鎖的底層原理       (1)加鎖機制       (2)鎖互斥機制       (3)watch dog自動延期機制   &nbs

面試請不要Spring Cloud底層原理

概述 毫無疑問,Spring Cloud是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對Spring Cloud功能使用的層面,其底層的很多原理,很多人可能並不知曉。因此本文將通過大量的手繪圖,給大家談談Spring Cloud微服務架構的底層原理。實際上,Spring

Java架構-拜託,面試請不要Redis分散式鎖的實現原理

一、寫在前面 現在面試,一般都會聊聊分散式系統這塊的東西。通常面試官都會從服務框架(Spring Cloud、Dubbo)聊起,一路聊到分散式事務、分散式鎖、ZooKeeper等知識。 所以咱們這篇文章就來聊聊分散式鎖這塊知識,具體的來看看Redis分散式鎖的實現原理。 說實

SpringCloud-拜託!面試請不要Spring Cloud底層原理實戰

上一篇我們說到《拜託!面試請不要再問我Spring Cloud底層原理》,我們大概瞭解了Spring Cloud中各個元件的作用以及其背後實現的原理。但是俗話說得好,實踐是檢驗真理的唯一標準。這一篇我們動手實踐一下,即搭建一個包含訂單服務、庫存服務、倉庫服務、積分服務的微服務架構專案。 一、

SpringCloud-拜託!面試請不要Spring Cloud底層原理

原文地址:https://mp.weixin.qq.com/s/mOk0KuEWQUiugyRA3-FXwg,原創作者:中華石杉,微信公眾號:石杉的架構筆記。 一、概述 毫無疑問,Spring Cloud是目前微服務架構領域的翹楚,無數的書籍部落格都在講解這個技術。不過大多數講解還停留在對S

不要Python2和Python3的Unicode 問題啦!

寫在之前 字元編碼問題幾乎是會跟隨我們整個程式設計生涯的一大魔障,一不小心各種玄學的問題就會接踵而至,防不勝防,尤其是對初學者來說,碰到編碼問題簡直是就是加快了踏上從入門到放棄的傳送帶。 字符集問題 很多時候在使用 Python 程式設計的時候,如果不使用 Unicode,處理中文

拜託!請不要Spring Cloud底層原理

目錄 一、業務場景介紹 二、Spring Cloud核心元件:Eureka 三、Spring Cloud核心元件:Feign 四、Spring Cloud核心元件:Ribbon 五、Spring Cloud核心元件:Hystrix 六、Spring Cloud核心

拜託!不要是否瞭解多執行緒了好嗎

  面試過程中,各面試官一般都會教科書式的問你幾個多執行緒的問題,但又不知從何問起。於是就來一句,你瞭解多執行緒嗎?拜託,這個有好傷自尊的!   相信老司機們對於java的多執行緒問題處理,穩如老狗了。你問我瞭解不?都懶得理你。   不過,既然是面對的是面試官,那你還得一一說來。   今天我們就從多個角度來領

面試官,不要三次握手和四次揮手

三次握手和四次揮手是各個公司常見的考點,也具有一定的水平區分度,也被一些面試官作為熱身題。很多小夥伴說這個問題剛開始回答的挺好,但是後面越回答越冒冷汗,最後就歇菜了。 見過比較典型的面試場景是這樣的: 面試官:請介紹下三次握手 求職者:第一次握手就是客戶端給伺服器端傳送一個報文,第二次就是伺服器收到報文之後

面試官,不要“Java GC垃圾回收機制”了

Java GC垃圾回收幾乎是面試必問的JVM問題之一,本篇文章帶領大家瞭解Java GC的底層原理,圖文並茂,突破學習及面試瓶頸。 楔子-JVM記憶體結構補充 在上篇《JVM之記憶體結構詳解》中有些內容我們沒有講,本篇結合垃圾回收機制來一起學習。還記得JVM中堆的結構圖嗎? 圖中展示了堆中三個區域:Ede

面試官,不要“Java 垃圾收集器”了

如果Java虛擬機器中標記清除演算法、標記整理演算法、複製演算法、分代演算法這些屬於GC收集演算法中的方法論,那麼“GC收集器”則是這些方法論的具體實現。 在面試過程中這個深度的問題涉及的比較少,但對於理解上面的這些演算法有很好的幫助。如果能夠如數家珍,也是面試中的加分項,還是那句話,畢竟面試官的時間也不多了

不要MVC、MVP、MVVM了

網路上有很多類似的討論。比如 阮一峰:MVC,MVP 和 MVVM 的圖示 廖雪峰:MVVM 司徒正美: 各自用一句話來概括MVC、MVP、MVVM的差異特點 。。。 但是說的往往比較概念化、空泛,初學者很難理解。本篇用最簡單的例子講解這三者,看完本篇,你就不會再糾結這個問題了   框架的起源與目的

拜託,不要執行緒池啦!

Java提供了幾種便捷的方法建立執行緒池,通過這些內建的api就能夠很輕鬆的建立執行緒池。在`java.util.concurrent`包中的`Executors`類,其中的靜態方法就是用來建立執行緒池的: * newFixedThreadPool():建立一個固定執行緒數量的執行緒池,而且執行緒池中的任務

單頁面跳轉添加返回和跳轉動畫(仿app) 只對單頁面和跳轉有用,用的是angualr,有不會的可以私信

hist page func margin consola color -s tar pla p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Consolas; color: #596972 } p.p2 { mar