• <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>

            qiezi的學(xué)習(xí)園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            CSDN上看到有人問能否實現(xiàn)一個效率較高的max函數(shù),效率接近于宏,于是自動動手寫了一個。

            由于max宏在判斷不同類型時,能夠返回大的那個類型(表示范圍大),所以只能使用模板來進(jìn)行返回類型的推導(dǎo)。

            在VC8上打開O2或Ox優(yōu)化選項,測試結(jié)果是與宏效率相等。

            全部實現(xiàn)如下:

            #include <typeinfo>
            #include 
            <cassert>
            #include 
            <windows.h>
            #include 
            <iostream>


            template 
            <class T, class U, bool B>
            struct BigType
            {
                typedef T result;
            };

            template 
            <class T, class U>
            struct BigType<T, U, false>
            {
                typedef U result;
            };



            template 
            <class T, class U>
            struct Type
            {
                typedef typename BigType
            <T, U, (sizeof(T) > sizeof(U))>::result BigType;
            };

            template 
            <class T>
            struct Type<T, double>
            {
                typedef 
            double BigType;
            };

            template 
            <class T>
            struct Type<double, T>
            {
                typedef 
            double BigType;
            };


            template 
            <class T>
            struct Type<T, float>
            {
                typedef 
            float BigType;
            };

            template 
            <class T>
            struct Type<float, T>
            {
                typedef 
            float BigType;
            };


            template 
            <>
            struct Type<doublefloat>
            {
                typedef 
            double BigType;
            };

            template 
            <>
            struct Type<floatdouble>
            {
                typedef 
            double BigType;
            };



            template 
            <class T, class U>
            typename Type
            <T, U>::BigType MaX (const T& t, const U& u)
            {
                typedef typename Type
            <T, U>::BigType ResultType;
                
            return ResultType(t > u ? t : u); // 原為return (ResultType)t > u ? t : u;
            }

            int main ()
            {
                assert (typeid(MaX(
            12)) == typeid(int));
                assert (MaX(
            12== 2);

                assert (typeid(MaX(
            12.5)) == typeid(double));
                assert (MaX(
            12.5== 2.5);

                assert (typeid(MaX(
            1, (float)2.5)) == typeid(float));
                assert (MaX(
            1, (float)2.5== 2.5);

                assert (typeid(MaX((
            double)2, (float)2.5)) == typeid(double));
                assert (MaX((
            double)2, (float)2.5== 2.5);

                assert (typeid(MaX((
            long)2, (float)2.5)) == typeid(float));
                assert (MaX((
            long)2, (float)2.5== 2.5);

                assert (typeid(MaX((
            long)2, (short)2)) == typeid(long));
                assert (MaX((
            long)2, (short)2== 2);

                assert (typeid(MaX((
            float)2, (__int64)2)) == typeid(float));
                assert (MaX((
            float)2, (__int64)2== 2);

                assert (std::
            string("hello"< "world");
                assert (typeid(MaX(std::
            string("hello"), "world")) == typeid(std::string));
                assert (MaX(std::
            string("hello"), "world"== "world");

                assert (typeid(MaX(std::
            string("world"), "hello")) == typeid(std::string));
                assert (MaX(std::
            string("hello"), "world"== "world");



                
            // 測試數(shù),需定義在循環(huán)外,防止編譯器優(yōu)化掉無意義的循環(huán)
                __int64 test = 0;
                
            long start = GetTickCount();
                
            for (int i=0; i<1000000000++i)
                {
                    test 
            += MaX(i, (__int64)i);
                }
                
            // test必須被使用,否則編譯器視為無用數(shù)據(jù),會被優(yōu)化掉
                std::cout << test << std::endl;
                std::cout 
            << (GetTickCount() - start) << std::endl;

                test 
            = 0;
                start 
            = GetTickCount();
                
            for (int i=0; i<1000000000++i)
                {
                    test 
            += max(i, (__int64)i);
                }
                std::cout 
            << test << std::endl;
                std::cout 
            << (GetTickCount() - start) << std::endl;

                
            return 0;
            }
            posted on 2005-12-12 10:45 qiezi 閱讀(2746) 評論(7)  編輯 收藏 引用 所屬分類: C++
            久久久青草青青国产亚洲免观| 狠狠色综合久久久久尤物| 亚洲中文字幕伊人久久无码| 欧美日韩精品久久久久| 午夜精品久久久久久久久| 91精品国产综合久久久久久| 久久久久亚洲av成人无码电影| 久久精品国产亚洲av麻豆蜜芽| 久久美女人爽女人爽| 久久久无码精品亚洲日韩京东传媒 | 久久久久久久波多野结衣高潮| 97久久天天综合色天天综合色hd| 精品多毛少妇人妻AV免费久久| 久久人人爽爽爽人久久久| 久久九色综合九色99伊人| 久久精品国产亚洲av日韩| 漂亮人妻被中出中文字幕久久| 99精品伊人久久久大香线蕉| 亚洲狠狠婷婷综合久久蜜芽 | 精品久久无码中文字幕| 久久e热在这里只有国产中文精品99| 久久久噜噜噜www成人网| 精品一二三区久久aaa片| 午夜精品久久久久成人| 久久精品人妻一区二区三区| 久久精品国产亚洲一区二区| 亚洲国产精品18久久久久久| 国产激情久久久久久熟女老人| 香蕉久久夜色精品国产2020| 久久久精品久久久久久 | 亚洲人成伊人成综合网久久久| 久久精品中文字幕一区| 九九久久精品国产| 久久强奷乱码老熟女网站| 久久99精品国产99久久6| 国内精品伊人久久久久网站| 久久99精品久久久久久野外| 久久精品女人天堂AV麻| 一级a性色生活片久久无| 久久久精品国产| 久久夜色精品国产噜噜噜亚洲AV|