欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

用C語言的泛型實現(xiàn)交換兩個變量值

 更新時間:2016年08月29日 16:10:04   投稿:daisy  
在日常編程里面經(jīng)常會遇到交換兩個變量的內(nèi)容的任務(wù),對于泛型類型而言有兩種泛型策略來實現(xiàn),下面跟著小編一起來學(xué)習(xí)學(xué)習(xí)。

第一種,最常用的是創(chuàng)建一個中間變量來循環(huán)交換它們的值:

T a = ...;
T b = ...;
.
T tmp = a; a = b; a = tmp;

我們稱這種策略p99_swap1。在這里,編譯器必須嚴(yán)格實現(xiàn)三個任務(wù)的順序,否則,由此程序產(chǎn)生的結(jié)果將是不正確的。

第二種,叫它p99_swap2,試圖做類似的事情,但放松一些順序約束:

T a = ...;
T b = ...;
.
T tmpa = a; T tmpb = b;
a = tmpb; b = tmpa;

用更多的資源(??臻g或寄存器)可以產(chǎn)生更有效的代碼。兩個對象可以平行地加載和保存。但收益可能只在小對象上可以看到。所以將兩者結(jié)合起來是一個可能的嘗試

#define P99_SWAP(A, B) (sizeof(A) > sizeof(uintmax_t) ? P99_SWAP1(A, B) : P99_SWAP2(A, B))

但是如何實現(xiàn)兩個 “子宏” P99_SWAP1 P99_SWAP2(A, B) ?如果我們想使用C的宏或者函數(shù)來實現(xiàn)的難度在于僅僅是傳遞參數(shù)A和B而不知道其類型,所以讓我們先寫函數(shù)和宏,忘記類型問題:

inline
void p00_swap2(void* a, void* b, void* tmpa, void* tmpb, size_t len) {
  memcpy(tmpa, a, len);
  memcpy(tmpb, b, len);
  memcpy(b, tmpa, len);
  memcpy(a, tmpb, len);
}
#define P00X_SWAP2(A, B) p00_swap2(
  &(A),                   \
  &(B),                   \
  (char[sizeof(A)]){ [0] = 0 },       \
  (char[sizeof(A)]){ [0] = 0 }, sizeof(A))

這個古怪的表達(dá)式: (char[sizeof(A)]){ [0] = 0 } 被稱為復(fù)合文字(C99新特性),為復(fù)制操作提供臨時對象。

這有幾個缺點。首先,我們甚至沒有檢查是否A和B與對象具有相同的大小,但我們很愉快地復(fù)制到他們。因此,首先,我們必須斷言它們至少具有相同的大小,避免引起不確定的行為。這樣就可以為兩個復(fù)合文字實現(xiàn)一些表達(dá)上的魔法:

(char[sizeof(A)]){ [(intmax_t)sizeof(A) - sizeof(B)] = 0 }

其中:intmax_t類型指定一個最大尺寸有符號整數(shù)

這里發(fā)生了什么?右邊的[]里面,一個指定的初始值,被用來初始化字符數(shù)組中的一個元素。現(xiàn)在我們將比較兩者的大?。喝绻麅烧呦嗟?,則表示位置0處的元素,如果sizeof(A) < sizeof(B) ,類型轉(zhuǎn)換 intmax_t 在編譯的期間將產(chǎn)生一個負(fù)數(shù)。

如果現(xiàn)在我們將上面的策略應(yīng)用于第二個復(fù)合文字,我們得到一個宏,在它調(diào)用兩個相同大小的對象的時候成功編譯,并在大小不同的時候在編譯期間產(chǎn)生錯誤:

#define P00_SWAP2(A, B)
p00_swap2(                           \
   &(A),                            \
   &(B),                            \
   (char[sizeof(A)]){ [(intmax_t)sizeof(A) - sizeof(B)] = 0 }, \
   (char[sizeof(B)]){ [(intmax_t)sizeof(B) - sizeof(A)] = 0 }, \
   sizeof(A))

這現(xiàn)在已經(jīng)是更安全,但也許還不夠安全,因為這兩個對象可能有相同的大小,但仍然不是同一類型。我們可以做一個額外的檢查來確定這兩種類型是否是兼容的。這可以通過下面這樣的可能第一眼看起來有點hack

(1 ? &(A) : ((A = B), NULL))
#define P99_SWAP(A, B) (sizeof(A) > sizeof(uintmax_t) ? P99_SWAP1(A, B) : P99_SWAP2(A, B))

這里的條件總是真,所以它總是等于&(A)。第二個“假”部分在運行時從未執(zhí)行,但只用來檢查它是否是正確的C代碼。如果A和B不會兼容,則表示不是正確的C代碼。

以上就是這篇文章的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)和工作能帶來幫助,如果有疑問可以留言交流。

相關(guān)文章

  • c++實現(xiàn)md5加密的代碼

    c++實現(xiàn)md5加密的代碼

    這篇文章主要介紹了c++實現(xiàn)md5加密的實例代碼,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06
  • C語言進(jìn)階輸入輸出重定向與fopen函數(shù)使用示例詳解

    C語言進(jìn)階輸入輸出重定向與fopen函數(shù)使用示例詳解

    這篇文章主要為大家介紹了C語言進(jìn)階輸入輸出重定向與fopen函數(shù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • C++關(guān)鍵字thread_local學(xué)習(xí)筆記

    C++關(guān)鍵字thread_local學(xué)習(xí)筆記

    這篇文章主要為大家介紹了C++關(guān)鍵字thread_local學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-10-10
  • c語言鏈表基本操作(帶有創(chuàng)建鏈表 刪除 打印 插入)

    c語言鏈表基本操作(帶有創(chuàng)建鏈表 刪除 打印 插入)

    這篇文章主要介紹了c語言鏈表基本操作,大家參考使用吧
    2013-12-12
  • Qt快速讀取大文件最后一行內(nèi)容解決方案

    Qt快速讀取大文件最后一行內(nèi)容解決方案

    這篇文章主要給大家介紹了關(guān)于Qt如何快速讀取大文件最后一行內(nèi)容的解決方案,文中通過代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Qt具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • C++中不得不說的map容器

    C++中不得不說的map容器

    大家好,本篇文章主要講的是C++中不得不說的map容器,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • C++優(yōu)先隊列的使用小結(jié)

    C++優(yōu)先隊列的使用小結(jié)

    普通的隊列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭刪除,在優(yōu)先隊列中,元素被賦予優(yōu)先級,本文主要介紹了C++優(yōu)先隊列的使用,感興趣的可以了解一下
    2023-11-11
  • C++11的for循環(huán),以及范圍Range類的簡單實現(xiàn)

    C++11的for循環(huán),以及范圍Range類的簡單實現(xiàn)

    下面小編就為大家?guī)硪黄狢++11的for循環(huán),以及范圍Range類的簡單實現(xiàn)。小編覺得挺不錯的, 現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • strcat函數(shù)與strncat函數(shù)的深入分析

    strcat函數(shù)與strncat函數(shù)的深入分析

    本篇文章是對strcat函數(shù)與strncat函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中Lambda表達(dá)式的語法與實例

    C++中Lambda表達(dá)式的語法與實例

    C++ 11 中的 Lambda 表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對象,以簡化編程工作,下面這篇文章主要給大家介紹了關(guān)于C++中Lambda表達(dá)式的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-10-10

最新評論