• <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的學習園地

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

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

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

            在VC8上打開O2或Ox優化選項,測試結果是與宏效率相等。

            全部實現如下:

            #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");



                
            // 測試數,需定義在循環外,防止編譯器優化掉無意義的循環
                __int64 test = 0;
                
            long start = GetTickCount();
                
            for (int i=0; i<1000000000++i)
                {
                    test 
            += MaX(i, (__int64)i);
                }
                
            // test必須被使用,否則編譯器視為無用數據,會被優化掉
                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 閱讀(2749) 評論(7)  編輯 收藏 引用 所屬分類: C++
            久久人人爽人人爽人人片AV不| 91精品国产91久久久久久| 国产精品VIDEOSSEX久久发布| 99久久国产主播综合精品| 激情综合色综合久久综合| 国产精品一区二区久久精品涩爱| 99久久国产亚洲综合精品| 久久精品国产亚洲av水果派| 国产叼嘿久久精品久久| 精品熟女少妇AV免费久久| 精品综合久久久久久97超人 | 日韩亚洲国产综合久久久| 亚洲精品无码久久久久久| 99久久精品国产一区二区蜜芽| 99久久这里只精品国产免费| 久久亚洲高清观看| 99精品国产99久久久久久97| 亚洲国产精品人久久| 亚洲人成伊人成综合网久久久| 国内精品久久国产大陆| 99久久无色码中文字幕人妻| 久久天天躁狠狠躁夜夜不卡| jizzjizz国产精品久久| 久久久久亚洲AV无码网站| 久久99九九国产免费看小说| 久久久精品国产亚洲成人满18免费网站 | 久久精品国产色蜜蜜麻豆| 国产午夜精品理论片久久| 久久精品国产99国产精品澳门 | 嫩草影院久久99| 狠狠色丁香婷婷久久综合不卡| 亚洲精品美女久久777777| 国产精品乱码久久久久久软件| 久久精品国产只有精品66| 国产精品成人99久久久久 | 国产成人无码精品久久久性色 | 97久久精品无码一区二区| 亚洲色欲久久久综合网| 国内精品久久久久影院亚洲| 伊人久久成人成综合网222| 2021国产精品久久精品|