<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      MethodTable內存空間分配中加法運算算法解析

        在分析MethodTable具體分配內存實現的時候,看到了計算MethodTable的大小,然后分配空間的算法。其中有個加法運算實現的非常贊,特地截取出來。

               所有的MethodTable的分配,都是通過methodtable中的一個static方法AllocagteNewMT來實現的,該方法定義如下:

      MethodTable * MethodTable::AllocagteNewMT(EEClass *pClass,

                                               DWORD dwVtableSlots,

                                               DWORD dwGCSize,

                                               DWORD dwNumInterfaces,

                                               DWORD numGenericArgs,

                                               DWORD dwNumDicts,

                                               DWORD cbDict,

                                               ClassLoader *pClassLoader,

                                               BaseDomain *pDomain,

                                               BOOL isInterface,

                                               BOOL fHasGenericsStaticsInfo,

                                               BOOL fNeedsRemotableMethodInfo,

                                               BOOL fNeedsRemotingVtsInfo,

                                               BOOL fHasThreadOrContextStatics

              , AllocMemTracker *pamTracker

      )

       

               下面是該方法中計算大小的一段,采用模板來忽略類型帶來的影響:

            DWORD cbTotalSize = 0;

            DWORD cbDicts = 0;

            if (!ClrSafeInt<DWORD>::multiply(dwNumDicts, sizeof(TypeHandle*), cbDicts) ||

                !ClrSafeInt<DWORD>::addition((DWORD)size, cbDicts, cbTotalSize) ||

                !ClrSafeInt<DWORD>::addition(cbTotalSize, dwGCSize, cbTotalSize))

                ThrowHR(COR_E_OVERFLOW);

              

               然后轉到addition((DWORD)size, cbDicts, cbTotalSize)的實現,加法的實現如下,加入了對各種情況的嚴格考慮:

          // Returns true if safe, false on overflow

          static inline bool addition(T lhs, T rhs, T &result)

      {

                         //check for T first.

              if(IsSigned())

              {

                  //test for +/- combo

                  if(!IsMixedSign(lhs, rhs))

                  {

                      //either two negatives, or 2 positives, not mixed symbols

                      if(rhs < 0)

                      {

                          //two negatives

                          if(lhs < (T)(MinInt() - rhs)) //remember rhs < 0

                          {

                              return false;

                          }

                          //ok

                      }

                      else

                      {

                          //two positives

                          if((T)(MaxInt() - lhs) < rhs)

                          {

                              return false;

                          }

                          //OK

                      }

                  }

                  //else overflow not possible

                  result = lhs + rhs;

                  return true;

              }

              else //unsigned, and two symbols is mixed

              {

                  if((T)(MaxInt() - lhs) < rhs)

                  {

                      return false;               

                  }

                  result = lhs + rhs;

                  return true;

              }

      }

       

      其中,涉及到中間調用的幾個方法如下:

      static bool IsSigned()

      {

      return( (T)-1 < 0 );

      }

       

      //Check if lhs and rhs is mixed Sign symbols

      static bool IsMixedSign(T lhs, T rhs)

      {

      return ((lhs ^ rhs) < 0);

      }

       

       

      //both of the following should optimize away

      static T MinInt()

      {

      if(IsSigned())

                         {

      return (T)((T)1 << (BitCount()-1));

                         }

          else

                         {

      return ((T)0);

                         }

      }

      static T MaxInt()

      {

      if(IsSigned())

                         {

      return (T)~((T)1 << (BitCount()-1));

      }

      //else

      return (T)(~(T)0);

      }

       

      檢查的挺詳細的,實現的也挺不錯。

       

      lbq1221110@Cnblogs.  11.5 ; first post at sscli.cnblogs.com

      posted on 2008-11-05 18:12  lbq1221119  閱讀(2106)  評論(5)    收藏  舉報

      導航

      主站蜘蛛池模板: 中文字幕久久六月色综合| 中文字幕亚洲综合第一页| 国产精品任我爽爆在线播放6080| 久久精品国产2020| 熟女视频一区二区在线观看| 蜜桃av亚洲精品一区二区| 99久久亚洲综合精品成人| 国产女同疯狂作爱系列| 免费现黄频在线观看国产| 国产成人永久免费av在线| 国产成人小视频| 国产肥妇一区二区熟女精品| 久久综合久中文字幕青草| 国产99精品成人午夜在线| 日韩深夜视频在线观看| 欧美高清狂热视频60一70| 九九热在线免费视频观看 | 上饶市| 国产一区二区三区九精品| 成人午夜av在线播放| 91中文字幕一区二区| 91老肥熟女九色老女人| 午夜精品一区二区三区在线观看 | 成人亚欧欧美激情在线观看| 四虎影视永久无码精品| 亚洲日韩欧美一区二区三区在线| 欧美成人精品高清在线播放| 人妻少妇精品系列一区二区 | 亚洲国产精品成人综合久| 最近中文字幕国产精选| 国产成人亚洲综合图区| 亚洲国产日韩一区三区| 国产福利酱国产一区二区| 浪潮av色综合久久天堂| 遂川县| 各种少妇wbb撒尿| 中文字幕va一区二区三区| 99久热在线精品视频| 内射老阿姨1区2区3区4区| 安龙县| 中国熟女仑乱hd|