• <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++
            国产精品美女久久久久av爽| 国产偷久久久精品专区| 国产精品久久久久…| 国产99久久久久久免费看| 无码任你躁久久久久久久| 久久青青色综合| 99国产精品久久| 97精品依人久久久大香线蕉97| 久久久精品午夜免费不卡| 人妻少妇精品久久| 欧美亚洲国产精品久久蜜芽| 伊人久久大香线蕉综合热线| 精品国产91久久久久久久| 久久精品国产亚洲av麻豆图片| 狠狠色综合网站久久久久久久| 无码人妻精品一区二区三区久久 | 国产精品久久波多野结衣| 精品视频久久久久| 婷婷久久综合九色综合98| 久久乐国产综合亚洲精品| 久久93精品国产91久久综合| 精品国产91久久久久久久| 伊人久久大香线蕉亚洲| 老男人久久青草av高清| 久久一区二区三区免费| 国产日韩久久免费影院| 日本精品久久久久中文字幕| 国内精品久久久久影院一蜜桃| 色欲久久久天天天综合网精品| 怡红院日本一道日本久久| a级成人毛片久久| 久久精品免费观看| 嫩草影院久久99| 国产精品一区二区久久精品无码| 久久精品国产影库免费看| 久久国产精品成人免费| 亚洲一区中文字幕久久| 久久高潮一级毛片免费| 日日狠狠久久偷偷色综合96蜜桃| 色悠久久久久久久综合网| 亚洲精品高清一二区久久|