• <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上看到有人問能否實(shí)現(xiàn)一個(gè)效率較高的max函數(shù),效率接近于宏,于是自動(dòng)動(dòng)手寫了一個(gè)。

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

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

            全部實(shí)現(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ù),會(huì)被優(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 閱讀(2735) 評(píng)論(7)  編輯 收藏 引用 所屬分類: C++
            亚洲一区二区三区日本久久九| 久久SE精品一区二区| 亚洲AV日韩精品久久久久久 | 狠狠色综合网站久久久久久久高清| 久久成人小视频| 欧美丰满熟妇BBB久久久| 久久人爽人人爽人人片AV| 99久久精品免费看国产一区二区三区 | 国产99久久九九精品无码| 国产亚洲精午夜久久久久久| 久久久久国产精品三级网| 噜噜噜色噜噜噜久久| 亚洲AV日韩AV天堂久久| 亚洲欧美日韩久久精品第一区| 97精品国产97久久久久久免费 | 久久精品国产福利国产琪琪| 久久性精品| 久久久精品免费国产四虎| 日本加勒比久久精品| 999久久久免费精品国产| 久久久青草青青国产亚洲免观| 久久精品国产国产精品四凭| 性做久久久久久久久久久| 久久99精品久久久大学生| 国产V综合V亚洲欧美久久| 久久福利资源国产精品999| 久久精品国产亚洲av高清漫画| 久久无码国产| 亚洲精品乱码久久久久66| 久久精品成人免费看| 久久精品国产亚洲AV嫖农村妇女 | 亚洲欧洲精品成人久久曰影片 | 国产精品福利一区二区久久| 国产精品成人精品久久久| 国产69精品久久久久APP下载| 久久久亚洲欧洲日产国码二区| 久久国产香蕉视频| 国产麻豆精品久久一二三| 欧美精品丝袜久久久中文字幕 | 亚洲精品97久久中文字幕无码| 久久人人爽人人爽人人爽 |