交換a,b值的C 各種寫法

2022-02-10 18:26:27 字數 1582 閱讀 7980

通常swap(a,b),都是用中間變數

public

static

void swap1(ref

int a, ref

intb)

生成的il如下(去除ref)

.maxstack 1

.locals

init (

[0] int32temp)

l_0000: ldarg.0

l_0001: stloc.0

l_0002: ldarg.1

l_0003: starg.s

a l_0005: ldloc.0

l_0006: starg.s

b l_0008: ret

如果面試官問你不適用任何第三方變數,那麼可以這樣

public

static

void swap2(ref

int a, ref

intb)

這樣做,a+b可能超出範圍,拋異常。所以得用位運算。

public

static

void swap3(ref

int a, ref

intb)

哇,位運算高效麼?計算機原理總是說位運算是最快的。沒錯!!!

可是,c#作為高階語言,效能跟生成的最終指令有關係,我們往往忽略了編譯器生成的最終指令。

位運算一看就是三組運算,生成il如下:

.method

public

hidebysig

static

void

(int32 a, int32 b)cil

managed

可見,比第一種用臨時變數生成的il要多不少,所以可以得出其速度慢於temp交換。事實的效能測試,也證明了如此。

其實還有一種更為巧妙的swap

public

static

void swap4(ref

int a, ref

intb)

生成的il十分詭異:

.maxstack 8

l_0000: ldarg.0

l_0001: ldarg.1

l_0002: starg.s

a l_0004: starg.s

b l_0006: ret

奇怪,怎麼a=b; b=a;就可以實現了?

好吧,其實我們又被編譯器給欺騙了,最終生成的彙編指令是這樣的麼?

(話說,我還不知道如何看c#生成的彙編指令,不知道哪個大牛告訴一下?)

通過一番蛋疼的效能測試。

我得出乙個結論:

位運算交換——慢。

temp交換——非常快。

詭異的交換——非常快。與temp不相上下,當然,百億級的測試,還是temp微弱優勢取勝。

其實,那個詭異的方法,最終也是暫存器交換操作,生成的機器指令應該和temp是一樣的。當然,這是我猜測的。o(∩_∩)o哈!

《論交換ab的值的四種寫法》

a a b b int t a a a b b t a a b a b b b t a b t a b b a t a 我們得到a b,b a a a b b a b a a b b b b a b a a b b a a b a a b a按位異或運算子 按位異或運算將兩個運算分量的對應位按位遵照...

ab測試壓力各種返回值

ab是apache自帶的乙個很好用的壓力測試工具,當安裝完apache的時候,就可以在bin下面找到ab 1 我們可以模擬100個併發使用者,對乙個頁面傳送1000個請求 ab n1000 c100 其中 n代表請求數,c代表併發數 返回結果 首先是apache的版本資訊 this is apach...

C程式設計,通過指標來交換a,b值 易錯點

這篇文章記錄乙個易錯點 如果要通過函式來實現a,b值的交換,我們應該都知道下面這個例子應該是實現不了的 以傳值的方式來呼叫函式 void swap int a,int b 因為引數傳遞採用的是傳值方式,上面的函式不會影響到呼叫它的例程中的a和b的值。擬定採用的指標傳遞位址的方式 void swap ...