• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-159  評論-223  文章-30  trackbacks-0
             
               為方便查看特定TCP服務器進程的CPU、內存和網絡連接情況,編寫了一個簡單的腳本perf.sh,其原理是指定--tcp或-t選項來調用netstat命令,指定aux -T選項參數調用ps命令,對輸出結果根據進程名稱或PID調用grep過濾;為了輸出結果的可讀性,先調用ps和netstat,用head取出保存大多是說明描述性的頭幾行。這里的實現具有如下特點:
                支持單獨查看CPU和內存利用率,或網絡連接情況,或兩者皆可,name表示進程名,address表示網絡地址
                支持輸出重定向,使用exec實現將標準輸出重定向到file文件,當沒指定-o file選項參數時,則為標準輸出
                支持設置刷新時間,當沒指定-t seconds選項參數時,則默認為3秒 
                支持顯示多線程,當指定-m選項時,則顯示多個線程的情況,默認不顯示
              1#! /bin/bash
              2#perf.sh
              3
              4name=
              5address=
              6file=
              7seconds=
              8show_mthread=0
              9is_count=0
             10
             11while getopts :p:n:o:t:mv opt
             12do
             13    case $opt in
             14    p)  name=$OPTARG
             15        ;;
             16    n)  address=$OPTARG
             17        ;;
             18    o)  file=$OPTARG
             19        ;;
             20    t)  seconds=$OPTARG
             21        ;;
             22    m)  show_mthread=1
             23        ;;
             24    v)  is_count=1
             25        ;;
             26    '?')    echo "$0: invalid option -$OPTARG" >&2
             27            echo "Usage: $0 [-p name] [-n address] [-o file] [-t seconds] [-m]" >&2
             28            exit 1
             29            ;;
             30    esac
             31done
             32
             33shift $((OPTIND-1))
             34
             35if [ -"$name" --"$address" ]; then
             36    print"Usage $(basename "$0") [-p name] [-n address] [-o file] [-t seconds] [-m]\nname or address must not be null\n"
             37    exit 1
             38fi
             39
             40if [ -"$seconds" ]; then
             41    seconds=3
             42fi
             43
             44psflag="aux"
             45if [ "$show_mthread" = 1 ]; then
             46    psflag="$psflag -T"
             47fi
             48
             49psheader="`ps $psflag | head -n 1`"
             50sortflag="-k3nr -k4nr" #sort by descend order according to cpu and mem 
             51
             52netflag="-an --tcp --inet"
             53netheader="`netstat $netflag | head -n 2`"
             54is_exist=
             55
             56show_process_info()
             57{
             58    if [ -"$1" ]; then
             59        return 255
             60    fi
             61
             62    result=`ps $psflag | grep -"$1" | grep --"gdb|grep|$0" | sort $sortflag`
             63    if [ -"$result" ]; then
             64        is_exist=0    
             65    else
             66        is_exist=1
             67        uptime 
             68        echo "$psheader" 
             69        echo "$result"
             70    fi
             71    echo ""
             72}

             73
             74show_net_connection()
             75{
             76    if [ -"$1" ]; then
             77        return 255
             78    fi
             79
             80    result=`netstat  $netflag | grep -E $1
             81    if [ -"$result" ]; then
             82        echo "$netheader" 
             83        if [ "$is_count" = 1 ]; then
             84            echo "$result" | awk '/^tcp/ ++S[$NF] } ENDfor(a in S) print a, S[a] }'
             85        fi
             86    fi
             87    echo ""
             88}

             89
             90tmpfile=`mktemp /tmp/per.XXXXXXXXXXXX`
             91
             92while true
             93do
             94    if [ -"$file" ]; then
             95        exec 1> $tmpfile
             96    fi
             97
             98    show_process_info $name
             99    show_net_connection $address
            100    echo ""
            101
            102    sleep $seconds
            103
            104    if [ -"$file" ]; then 
            105        exec 1>&-
            106
            107        if [ "$is_exist" = 1 ]; then
            108            cat $tmpfile >> $file
            109        fi
            110
            111        size=`ls -l $file | awk '{print $5}'`
            112        if [ $size -ge $(expr 1024 \* 1024 \* 1) ]; then
            113            cat  /dev/null > $file    
            114        fi
            115    else
            116        clear
            117    fi
            118done
               最后順便提下,上面是查看某單個服務器進程的性能,若要查看整體服務器系統的性能,可以運用vmstat、iostat和free等命令。
            posted @ 2012-09-04 16:35 春秋十二月 閱讀(1714) | 評論 (1)編輯 收藏
            原理
               在linux平臺下編譯由多個源碼文件或目錄組成的項目工程時,需要編寫make腳本即Makefile文件來編譯,當項目工程寵大時,這種方式比單純地使用gcc命令行方便快捷,且易于維護。由于具體工程的源碼文件數量的多少及名稱的不同,因此編寫一個較為通用的Makefile文件,來實現編譯各種不同的工程,具有重要的參考意義和價值。本文展示了通用Makefile.in文件及其應用示例。Makefile.in文件,顧名思義,內部實現用的,應由外部具體的Makefile文件提供具體的命令行參數來調用,它包括exe,static,share三個規則目標,因此支持可執行文件、動態庫和靜態庫三種工程的編譯,而每種工程又支持debug和release兩種版本,默認為release版本,在編譯時會自動創建debug或release目錄來存放所有中間文件*.o和*.d。在其腳本源碼中,詳見下面實現,小寫變量為內部所有,大寫變量為make命令行提供的參數,目前支持以下幾種命令行參數:
                 1)輸出名稱:OUT_NAME,對于庫工程,內部自動添加lib前綴
                 2)輸出路徑:OUT_PATH,
            末尾反斜杠/可有可無
                 3)源碼路徑:SRC_PATH, 末尾反斜杠/可有可無
                 4)依賴動態庫路徑:SHARE_PATH,不帶庫名稱的路徑, 末尾反斜杠/可有可無 
                 5)依賴動態庫名稱:SHARE_LIB,不帶庫路徑的名稱,內部自動添加-l前綴
                 6)依賴靜態庫路徑:STATIC_PATH,不帶庫名稱的路徑,
            尾反斜杠/可有可無
                 7)依賴靜態庫路徑:STATIC_LIB,不帶庫路徑的名稱
                 8)預定義宏:MACROS,內部自動添加-D前綴
                 9)編譯模式:MODE,表示編譯成debug或release版本
                 關于頭文件包含的支持,這里沒有提供命令行參數,在內部它固定為SRC_PATH、/usr/include和/usr/local/include三個路徑,對于大多數的工程,應該夠用了。

            實現
             1#Makefile.in
             2
             3inc_path := $(SRC_PATH) /usr/include /usr/local/include
             4inc_path := $(addprefix -I,$(inc_path))
             5override SHARE_PATH += /usr/lib /usr/local/lib
             6override SHARE_PATH  := $(addprefix -L,$(SHARE_PATH))
             7override SHARE_LIB  := $(if $(SHARE_LIB),$(addprefix -l,$(SHARE_LIB)))
             8override STATIC_PATH := $(patsubst %/,%,$(STATIC_PATH)) 
             9override STATIC_LIB := $(if $(STATIC_PATH),$(if $(STATIC_LIB),$(addprefix $(STATIC_PATH)/,$(STATIC_LIB))))
            10override SRC_PATH := $(patsubst %/,%,$(SRC_PATH))
            11override MACROS := $(addprefix -D,$(MACROS))
            12
            13cxxflags := -Wall $(MACROS)
            14
            15ifeq ($(MODE),debug)
            16  cxxflags += -
            17  tmp_path := $(SRC_PATH)/debug
            18else
            19  cxxflags += -O2 -DNDEBUG 
            20  tmp_path := $(SRC_PATH)/release
            21endif
            22
            23lib_name := $(addprefix lib,$(OUT_NAME))
            24
            25srcs := $(wildcard $(SRC_PATH)/*.c) $(wildcard $(SRC_PATH)/*.cpp)
            26deps := $(patsubst %.c,%.d,$(patsubst %.cpp,%.d,$(srcs)))
            27deps := $(foreach dep,$(deps),$(notdir $(dep)))
            28deps := $(addprefix $(tmp_path)/,$(deps))
            29
            30objs := $(patsubst %.c,%.o,$(patsubst %.cpp,%.o,$(srcs)))
            31objs := $(foreach obj,$(objs),$(notdir $(obj)))
            32objs := $(addprefix $(tmp_path)/,$(objs))
            33
            34share_name  := $(tmp_path)/$(lib_name).so
            35static_name := $(tmp_path)/$(lib_name).a
            36exe_name    := $(tmp_path)/$(OUT_NAME)
            37    
            38override MACROS := $(if $(MACROS),$(addprefix -D,$(MACROS)))
            39
            40.PHONY: exe lib static share clean config
            41
            42arflags    := -rc
            43
            44definMKDIR
            45if [ ! -d $(tmp_path) ]; then \
            46mkdir $(tmp_path);\
            47fi 
            48endef
            49
            50config:
            51    @$(MKDIR)
            52
            53exe: config $(exe_name)
            54
            55lib: config static share
            56
            57static: $(static_name)
            58    
            59share: $(share_name)
            60
            61$(exe_name): $(objs) 
            62    @echo "Linking to execute ($@ : $(objs))."
            63    $(CXX) -o $@ $(objs) $(SHARE_PATH) $(SHARE_LIB) $(STATIC_LIB)
            64    @cp $(exe_name) $(OUT_PATH) 
            65        
            66$(static_name): $(objs)
            67    @echo "Archive to static library ($@ [$(objs)])."
            68    $(AR) $(arflags) $@ $(objs)
            69    @cp $(static_name) $(OUT_PATH) 
            70    
            71$(share_name): $(objs)
            72    @echo "Linking to shared library ($@ [$(objs)])."
            73    $(CXX) $(cxxflags) -o $@ $(objs) -fPIC -shared
            74    @cp $(share_name) $(OUT_PATH) 
            75    
            76$(tmp_path)/%.o: $(SRC_PATH)/%.cpp $(tmp_path)/%.d
            77    @echo "Compile $@ ($<)."
            78    $(CXX) $(cxxflags) $(inc_path) -c $< -o $@
            79
            80$(tmp_path)/%.d: $(SRC_PATH)/%.cpp 
            81    @echo "Compile $@ ($<)."
            82    $(CXX) $(cxxflags) -MM $< -o $@.$$$$; \
            83    sed 's,\($*\)\.o[ :]*,\1.o $@:, g' < $@.$$$$ > $@; \
            84    rm -f $@.$$$$
            85
            86-include $(deps)
            87
            88clean:
            89    $(RM) $(objs) $(deps) $(share_name) $(static_name) $(exe_name)

            應用
               這里假設有兩個源碼子目錄netcomm和server,前者為動態庫netcomm工程,后者為主程序server工程,它依賴netcomm庫,每個目錄下都有其自己的Makefile,這個用于編譯單個模塊或主程序,它們的父目錄為src,在這個目錄下有兩個Makefile文件,一個是Makefile.in,這個就是上面講到的通用內部Makefile;另一個是Makefile,這個用來聯編所有的模塊和主程序。
               先來看下netcomm的Makefile文件內容,如下所示
             1path := SRC_PATH=. OUT_PATH=../../output
             2
             3.PHONY: all debug release clean
             4
             5all: debug release 
             6    
             7debug:
             8    $(MAKE) -../Makefile.in lib MODE=debug OUT_NAME=netcommd $(path)
             9
            10release:
            11    $(MAKE) -../Makefile.in lib MODE=release OUT_NAME=netcomm $(path)
            12
            13clean:
            14    $(MAKE) -../Makefile.in clean MODE=debug OUT_NAME=netcommd $(path)
            15    $(MAKE) -../Makefile.in clean MODE=release OUT_NAME=netcomm $(path)
                 
               再看下server的Makefile文件內容,如下所示   
             1macros := MACROS="_USE_MEM_POOL=1"
             2
             3path := SRC_PATH=. OUT_PATH=../../output SHARE_PATH=../../output
             4
             5.PHONY: all debug release clean 
             6
             7all: debug release 
             8
             9debug:
            10    $(MAKE) -../Makefile.in exe MODE=debug OUT_NAME=serverd SHARE_LIB="netcommd" $(macros) $(path)
            11
            12release:
            13    $(MAKE) -../Makefile.in exe MODE=release OUT_NAME=server SHARE_LIB="netcomm" $(macros) $(path)
            14
            15clean:
            16    $(MAKE) -../Makefile.in clean MODE=debug OUT_NAME=serverd $(path)
            17    $(MAKE) -../Makefile.in clean MODE=release OUT_NAME=server $(path)
                
               最后看下src的Makefile文件內容,如下所示
             1.PHONY: all release debug clean
             2
             3all: debug release
             4
             5debug:
             6    $(MAKE) debug -C netcomm 
             7    $(MAKE) debug -C server
             8
             9release:
            10    $(MAKE) release -C netcomm
            11    $(MAKE) release -C server
            12
            13clean:
            14    $(MAKE) clean -C netcomm
            15    $(MAKE) clean -C server
               以上所有腳本代碼,在make 3.81下測試通過。
            posted @ 2012-08-16 19:29 春秋十二月 閱讀(3514) | 評論 (3)編輯 收藏
                 摘要:    信號量是一種用于并發環境同步手段的原語,分為無名信號量和有名信號量兩種,前者只能用于線程間同步,而后者還可用于進程間同步。它包括創建、等待、掛出、取值和銷毀5種基本操作。與互斥鎖不同的是:    ● 信號量擁有一個計數值,表示可用的資源數量,僅當該值為0或1時,則相當于互斥鎖。    &...  閱讀全文
            posted @ 2012-07-20 10:52 春秋十二月 閱讀(2171) | 評論 (0)編輯 收藏
                 摘要:    互斥鎖,用來保證任一時刻只有單個線程或進程擁有對共享資源的互斥訪問權,在這里將posix thread中的互斥體、win32中的互斥體和臨界區,統稱為互斥鎖,其特點如下:   ● 范圍:線程鎖和進程鎖,前者僅用于同一進程內多線程間,而后者用于進程間,顯然,它也能用于同一進程內多線程間,但效率較低。posix的互斥體既可以是線程鎖,...  閱讀全文
            posted @ 2012-06-23 00:08 春秋十二月 閱讀(3576) | 評論 (2)編輯 收藏
                 摘要:     socket pair,也稱套接字管道,主要用來實現進程內或進程間的一對一的全雙工或半雙工通信,在IO復用模型(如select,poll,epoll等)中起到通知中斷退出循環的作用,在類UNIX系統中已經有現成的實現,API為socketpair,但在Windows系統中沒有,因此本文主要講述Windows平臺下soketpair的實現及應用,支持IPv4和I...  閱讀全文
            posted @ 2012-06-17 03:02 春秋十二月 閱讀(3027) | 評論 (3)編輯 收藏
               自旋鎖作為一種并發同步的手段,特別適用于競爭少和鎖時間短的情況,在驅動及內核代碼中經常被用到,本文講述一種適合用戶態程序的自旋鎖,支持Windows和Linux(GCC>=4.1.2)平臺,并提供了C語言的接口和實現。

            接口
               spin_trylock如果獲取成功返回1,否則返回0;spin_is_lock如果已加鎖,返回1,否則返回0。
             1typedef struct 
             2{
             3 volatile long  flag_;
             4 volatile long* spin_;
             5}
            spin_lock_t;
             6
             7void spin_init(spin_lock_t* lock,long* flag);
             8
             9void spin_lock(spin_lock_t* lock);
            10
            11int spin_trylock(spin_lock_t* lock);
            12
            13void spin_unlock(spin_lock_t* lock);
            14
            15int spin_is_lock(spin_lock_t* lock);

            實現
             1#ifdef _MSC_VER
             2#include <windows.h>
             3#elif defined(__GNUC__)
             4#if __GNUC__<4 || (__GNUC__==4 && __GNUC_MINOR__<1)
             5#error GCC version must be greater or equal than 4.1.2
             6#endif
             7#include <sched.h>
             8#else
             9#error Currently only windows and linux os are supported
            10#endif
            11
            12void spin_init(spin_lock_t* lock,long* flag)
            13{
            14#ifdef _MSC_VER
            15    InterlockedExchange((volatile long*)&lock->flag_,0);
            16    InterlockedExchange((volatile long*)&lock->spin_,flag?(long)flag:(long)&lock->flag_);
            17#elif defined(__GNUC__)
            18    __sync_and_and_fetch((long*)&lock->flag_,0);
            19    __sync_lock_test_and_set((long*)&lock->spin_,flag?(long)flag:(long)&lock->flag_);
            20#endif
            21}

            22
            23void spin_lock(spin_lock_t* lock)
            24{
            25#ifdef _MSC_VER
            26    for (;0!=InterlockedExchange((volatile long*)lock->spin_,1);)
            27    {
            28        Sleep(1);
            29    }

            30#elif defined(__GNUC__)
            31    for (;0!=__sync_fetch_and_or(lock->spin_,1);)
            32    {
            33        sched_yield();
            34    }

            35#endif
            36}

            37
            38int spin_trylock(spin_lock_t* lock)
            39{
            40#ifdef _MSC_VER
            41    return !InterlockedExchange((volatile long*)lock->spin_,1);
            42#elif defined(__GNUC__)
            43    return !__sync_fetch_and_or(lock->spin_,1);
            44#endif
            45}

            46
            47void spin_unlock(spin_lock_t* lock)
            48{
            49#ifdef _MSC_VER
            50    InterlockedExchange((volatile long*)lock->spin_,0);
            51#elif defined(__GNUC__)
            52    __sync_and_and_fetch(lock->spin_,0);
            53#endif
            54}

            55
            56int spin_is_lock(spin_lock_t* lock)
            57{
            58#ifdef _MSC_VER
            59    return InterlockedExchangeAdd((volatile long*)lock->spin_,0);
            60#elif defined(__GNUC__)
            61    return __sync_add_and_fetch(lock->spin_,0);
            62#endif
            63}
            posted @ 2012-06-13 21:02 春秋十二月 閱讀(3055) | 評論 (3)編輯 收藏
                 摘要: 主類模板    gcc從4.1.2版本開始提供了__sync_*系列的內置API,用于加減和邏輯運算,可以對1,2,4,8字節長度的數值或指針類型進行原子操作,為方便使用,筆者對這些API作了簡單的封裝。 Code highlighting produced by Actipro CodeHighlighter (freeware) http://...  閱讀全文
            posted @ 2012-06-08 00:19 春秋十二月 閱讀(4571) | 評論 (1)編輯 收藏
                 摘要:      類型選擇是一種編譯時的類型計算技術,也就是根據條件判斷來匹配對應的類型,功能形如運行時的if else和switch case控制結構。在這里仿真運行時的條件語句,實現了類型選擇,包括if單分支、if多分支和switch case三種結構,關于其原理及細節就不多講了,直接看如下代碼  (1)if單分支 Code ...  閱讀全文
            posted @ 2012-06-06 13:49 春秋十二月 閱讀(2069) | 評論 (1)編輯 收藏
                 摘要: 基本原理   在數據輸入隨機分布的情況下,快速排序具有較好的性能表現,但當元素個數比其關鍵字的取值范圍大,而這個范圍相對較小時,使用一種關鍵字索引統計排序會快很多,因為它的時間復雜度是線性的,基本原理是使用數組(為描述方便,特稱統計數組),其下標對應關鍵字的值,存儲元素按待排序關鍵字的值統計的出現次數,然后再按元素關鍵字的值,結合統計數組,放回到最終位置上。常規的實現...  閱讀全文
            posted @ 2012-05-31 12:11 春秋十二月 閱讀(1809) | 評論 (0)編輯 收藏
               本文就Loki編譯期技術中的類型列表Typelist作了一些擴展,增加了以下幾個方法:
                  • 獲取最大和最小長度,即求取Typelist中長度最大和最小的值  
                  • 獲取最大和最小類型,即求取Typelist中長度最大和最小的類型


            實現
               位于Loki::TL命名空間,利用遞歸計算最值結果,使用宏生成主類模板和特化類模板,其中后綴為DEFN(N為正整數)形式的宏中N表示特化類模板所帶的模板參數數量,使用DEF1宏定義對應的特化類模板的原因在于:當Typelist中存在非NullType類型時,保證結果的正確性。當N為2時參數取值:name為Max則b為true;name為Min則b為false。
               主類模板
               用于定義MaxSize、MinSize和MaxType、MinType主類模板,使用宏LOKI_TYPELIST_METHOD_DEF生成。 
            1    #define LOKI_TYPELIST_METHOD_DEF(name)\
            2    template <class TList>\
            3    struct name;\
            4    
            5    LOKI_TYPELIST_METHOD_DEF(MaxSize)
            6    LOKI_TYPELIST_METHOD_DEF(MinSize)
            7    LOKI_TYPELIST_METHOD_DEF(MaxType)
            8    LOKI_TYPELIST_METHOD_DEF(MinType)

               最大(小)長度
               對應類主模板分別為MaxSize和MinSize,每種有3個特化模板,使用宏LOKI_TYPELIST_SIZE_SPEC_DEFN生成(N為0、1、2)。
             1    #define LOKI_TYPELIST_SIZE_SPEC_DEF0(name)\
             2    template<>\
             3    struct name##Size<NullType>\
             4    {\
             5        enum { value = 0 };\
             6    }
            ;\
             7    
             8    #define LOKI_TYPELIST_SIZE_SPEC_DEF1(name)\
             9    template<class T>\
            10    struct name##Size<Typelist<T,NullType> >\
            11    {\
            12        enum { value = sizeof(T) };\
            13    }
            ;\
            14    
            15    #define LOKI_TYPELIST_SIZE_SPEC_DEF2(name,b)\
            16    template<class T,class U>\
            17    struct name##Size<Typelist<T,U> >\
            18    {\
            19        enum { tmp = name##Size<U>::value };\
            20        enum { value = (b ? sizeof(T) > tmp : sizeof(T) < tmp) ? sizeof(T) : tmp };\
            21    }
            ;\
            22    
            23    LOKI_TYPELIST_SIZE_SPEC_DEF0(Max)
            24    LOKI_TYPELIST_SIZE_SPEC_DEF0(Min)
            25    LOKI_TYPELIST_SIZE_SPEC_DEF1(Max)
            26    LOKI_TYPELIST_SIZE_SPEC_DEF1(Min)
            27    LOKI_TYPELIST_SIZE_SPEC_DEF2(Max,true)
            28    LOKI_TYPELIST_SIZE_SPEC_DEF2(Min,false)
            29    
            30    #undef LOKI_TYPELIST_SIZE_SPEC_DEF0
            31    #undef LOKI_TYPELIST_SIZE_SPEC_DEF1
            32    #undef LOKI_TYPELIST_SIZE_SPEC_DEF2

               最大(小)類型
               對應類主模板分別為MaxType和MinType,每種有3個特化模板,使用宏LOKI_TYPELIST_TYPE_SPEC_DEFN生成(N為0、1、2)。   
             1    #define LOKI_TYPELIST_TYPE_SPEC_DEF0(name)\
             2    template<>\
             3    struct name##Type<NullType>\
             4    {\
             5        typedef NullType type;\
             6    }
            ;\
             7    
             8    #define LOKI_TYPELIST_TYPE_SPEC_DEF1(name)\
             9    template<class T>\
            10    struct name##Type<Typelist<T,NullType> >\
            11    {\
            12        typedef T type;\
            13    }
            ;\
            14    
            15    #define LOKI_TYPELIST_TYPE_SPEC_DEF2(name,b)\
            16    template<class T,class U>\
            17    struct name##Type<Typelist<T,U> >\
            18    {\
            19        typedef typename name##Type<U>::type R;\
            20        typedef typename Select< b ? (sizeof(T)>sizeof(R)) : (sizeof(T)<sizeof(R)),T,R>::Result type;\
            21    }
            ;\
            22    
            23    LOKI_TYPELIST_TYPE_SPEC_DEF0(Max)
            24    LOKI_TYPELIST_TYPE_SPEC_DEF0(Min)
            25    LOKI_TYPELIST_TYPE_SPEC_DEF1(Max)
            26    LOKI_TYPELIST_TYPE_SPEC_DEF1(Min)
            27    LOKI_TYPELIST_TYPE_SPEC_DEF2(Max,true)
            28    LOKI_TYPELIST_TYPE_SPEC_DEF2(Min,false)
            29    
            30    #undef LOKI_TYPELIST_TYPE_SPEC_DEF0
            31    #undef LOKI_TYPELIST_TYPE_SPEC_DEF1
            32    #undef LOKI_TYPELIST_TYPE_SPEC_DEF2
               這里用到了Loki中的Select組件來選擇類型。

            示例
               使用LOKI中的LOKI_STATIC_CHECK宏來做編譯期診斷結果正確性。
             1#define LOKI_TL4 LOKI_TYPELIST_4(double,int,short,char) 
             2
             3int main(int argc,char *argv[])
             4{
             5    static const int max_val = Loki::TL::MaxSize<LOKI_TL4 >::value;
             6    LOKI_STATIC_CHECK(max_val==sizeof(double),max_val_should_be_sizeof_double)
             7
             8    static const int min_val = Loki::TL::MinSize<LOKI_TL4 >::value;
             9    LOKI_STATIC_CHECK(min_val==sizeof(char),min_val_should_be_sizeof_char)
            10
            11    typedef Loki::TL::MaxType<LOKI_TL4 >::type max_type;
            12    LOKI_STATIC_CHECK((Loki::IsSameType<max_type,double>::value),max_type_should_be_double)
            13
            14    typedef Loki::TL::MinType<LOKI_TL4 >::type min_type;
            15    LOKI_STATIC_CHECK((Loki::IsSameType<min_type,char>::value),min_type_should_be_char)
            16
            17    return 0;
            18}
            posted @ 2012-05-29 01:03 春秋十二月 閱讀(1899) | 評論 (2)編輯 收藏
            僅列出標題
            共16頁: First 8 9 10 11 12 13 14 15 16 
            少妇熟女久久综合网色欲| 国产91久久精品一区二区| 狠狠色丁香婷婷久久综合| 婷婷伊人久久大香线蕉AV| 国产成人精品久久亚洲| 久久热这里只有精品在线观看| 国产午夜精品久久久久免费视| 久久久精品久久久久久| av无码久久久久久不卡网站| 久久天天躁狠狠躁夜夜av浪潮| 久久精品国产亚洲AV无码娇色| 午夜视频久久久久一区| 国产99精品久久| 久久久久久精品免费看SSS | 精品综合久久久久久97| 一本色道久久88加勒比—综合| 亚洲日本va中文字幕久久| 欧美粉嫩小泬久久久久久久 | 久久人人超碰精品CAOPOREN| 国产精品久久久天天影视| 久久亚洲中文字幕精品一区| 国产综合精品久久亚洲| 国内精品久久久久| 人人狠狠综合久久88成人| 久久只有这里有精品4| 久久本道久久综合伊人| 97久久精品人人做人人爽| 久久精品无码专区免费青青| 久久久久久国产精品无码下载| 一级a性色生活片久久无少妇一级婬片免费放| 91精品免费久久久久久久久| 成人国内精品久久久久影院| 久久99精品久久久久久久久久| 日本强好片久久久久久AAA| 久久亚洲精品中文字幕| 亚洲va久久久噜噜噜久久男同 | 欧美亚洲国产精品久久蜜芽| 国内精品久久久久影院免费| 97热久久免费频精品99| 久久99国产精品一区二区| 久久夜色精品国产亚洲|