青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-341  評論-2670  文章-0  trackbacks-0
    為了讓編譯成x86后的代碼可以轉換成C++的函數指針,我們也必須處理成員對齊的事情。如果腳本里的結構成員對齊跟C++不一致的話,會造成很多麻煩。下面是成員對齊的計算方法:

    一個類型有兩種屬性,一種是尺寸,另一種是對齊單位,可以分別用sizeof和__alignof來表示。

    1:對于基本類型(char、short、double等)T有__alignof(T) == sizeof(T)
    2:對于數組類型T[N]有__alignof(T[N]) == __alignof(T),sizeof(T[N]) == sizeof(T)×N
    3:對于結構類型T=T1×T2×...×Tn,有__alignof(T) = max(__alignof(Ti)),sizeof(T) = align(offset(Tn)+sizeof(Tn) , __alignof(T))
    4:如果一個類型結構T為空,那么sizeof(T) == __alignof(T) == 1

    offset(Tn)是第n個成員相對于T起始位置的偏移,而align(S,A)可以用如下代碼計算:
1 VInt Align(VInt Offset , VInt Alignment)
2 {
3     if(Alignment==0)
4     {
5         Alignment=1;
6     }
7     return (Offset+Alignment-1)/Alignment*Alignment;
8 }

    于是就剩下offset(Tn)了。有了Align之后就可以遞歸定義offset(Tn):
    offset(T1)=0
    offset(Ti)=align(offset(Ti-1)+sizeof(Ti-1) , __alignof(Ti))

    于是我們可以得到定理:
    1:sizeof(T) == 0 (mod __alignof(T))
    2:當T=T1×T2×...×Tn中T1==T2==...==Tn的時候,T的結構與T1[n]的結構完全一致
    3:對于任意類型集合{T1 T2 ... Tn}有max(__alignof(Ti)) <= max(__alignof(基本類型集合))

    以上結論在VC++的缺省設置中有效,如果為一個struct強行指定了pack和__alignof,將使用另外的規則。

    為了證明以上式子,我寫了一段程序,通過上面的方法計算成員的sizeof、__alignof以及offset,最后跟C++的編譯結果互相驗證:
 1 #include "..\..\..\..\VL++\Library\Platform\VL_Console.h"
 2 #include "..\..\..\..\VL++\Library\Script\JIT\Assembler\VL_JIT_MemberAlignment.h"
 3 
 4 using namespace vl;
 5 using namespace vl::jit::alignment;
 6 using namespace vl::platform;
 7 
 8 struct SubStructForTest
 9 {
10     char Char;
11     double Double;
12     short Short;
13     int Int;
14 };
15 
16 struct StructForTest
17 {
18     SubStructForTest Sub;
19     double Double[8];
20     SubStructForTest Subs[10];
21     char Char;
22 };
23 
24 #define OFFSET_OF(TYPE,MEMBER) (VInt)(&((TYPE*)0)->MEMBER)
25 
26 void Main_Alignment()
27 {
28     VL_AutoPtr<VL_AlignStruct> SubStruct=new VL_AlignStruct;
29     SubStruct->AddMember(new VL_AlignBasic(vabtAsciiChar));
30     SubStruct->AddMember(new VL_AlignBasic(vabtDouble));
31     SubStruct->AddMember(new VL_AlignBasic(vabtInt16));
32     SubStruct->AddMember(new VL_AlignBasic(vabtInt32));
33 
34     VL_AutoPtr<VL_AlignStruct> Struct=new VL_AlignStruct;
35     Struct->AddMember(SubStruct);
36     Struct->AddMember(new VL_AlignArray(new VL_AlignBasic(vabtDouble),8));
37     Struct->AddMember(new VL_AlignArray(SubStruct,10));
38     Struct->AddMember(new VL_AlignBasic(vabtAsciiChar));
39 
40     GetConsole()->Write(VUnicodeString(SubStruct->GetMember(0).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(SubStructForTest,Char))+L"\r\n");
41     GetConsole()->Write(VUnicodeString(SubStruct->GetMember(1).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(SubStructForTest,Double))+L"\r\n");
42     GetConsole()->Write(VUnicodeString(SubStruct->GetMember(2).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(SubStructForTest,Short))+L"\r\n");
43     GetConsole()->Write(VUnicodeString(SubStruct->GetMember(3).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(SubStructForTest,Int))+L"\r\n");
44     GetConsole()->Write(VUnicodeString(SubStruct->GetSize())+L"\t"+VUnicodeString((VInt)sizeof(SubStructForTest))+L"\r\n");
45     GetConsole()->Write(L"\t\n");
46 
47     GetConsole()->Write(VUnicodeString(Struct->GetMember(0).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(StructForTest,Sub))+L"\r\n");
48     GetConsole()->Write(VUnicodeString(Struct->GetMember(1).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(StructForTest,Double))+L"\r\n");
49     GetConsole()->Write(VUnicodeString(Struct->GetMember(2).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(StructForTest,Subs))+L"\r\n");
50     GetConsole()->Write(VUnicodeString(Struct->GetMember(3).GetOffset())+L"\t"+VUnicodeString(OFFSET_OF(StructForTest,Char))+L"\r\n");
51     GetConsole()->Write(VUnicodeString(Struct->GetSize())+L"\t"+VUnicodeString((VInt)sizeof(StructForTest))+L"\r\n");
52 }

    最后是結果:

    vl::jit::alignment頭文件:
  1 /*******************************************************************************
  2 Vczh Library++ 2.0
  3 JIT::成員對齊
  4 開發者:陳梓瀚
  5 
  6 接口:
  7 類:
  8 函數:
  9 *******************************************************************************/
 10 
 11 #ifndef VL_JIT_MEMBERALIGNMENT
 12 #define VL_JIT_MEMBERALIGNMENT
 13 
 14 #include "..\..\..\Data\Data\VL_Data_Basic.h"
 15 #include "..\..\..\Data\Data\VL_Data_List.h"
 16 
 17 namespace vl
 18 {
 19     namespace jit
 20     {
 21         namespace alignment
 22         {
 23             using namespace collection;
 24 
 25             class VL_AlignType : public VL_Base
 26             {
 27             public:
 28                 typedef VL_AutoPtr<VL_AlignType>            Ptr;
 29                 typedef VL_AutoPtr<const VL_AlignType>        ConstPtr;
 30 
 31                 virtual VInt                    GetSize()const=0;
 32                 virtual VInt                    GetAlignment()const=0;
 33             };
 34 
 35             class VL_AlignMember : public VL_Base
 36             {
 37             protected:
 38                 VL_AlignType::Ptr                FType;
 39                 VInt                            FMinOffset;
 40             public:
 41                 typedef VL_List<VL_AlignMember , false>        List;
 42 
 43                 VL_AlignMember();
 44 
 45                 VL_AlignType::ConstPtr            GetType()const;
 46                 void                            SetType(VL_AlignType::Ptr Type);
 47                 VInt                            GetOffset()const;
 48                 void                            SetMinOffset(VInt MinOffset);
 49             };
 50 
 51             class VL_AlignArray : public VL_AlignType
 52             {
 53             protected:
 54                 VL_AlignType::Ptr                FType;
 55                 VInt                            FCount;
 56             public:
 57                 VL_AlignArray(VL_AlignType::Ptr Type , VInt Count);
 58 
 59                 VInt                            GetSize()const;
 60                 VInt                            GetAlignment()const;
 61                 VL_AlignType::ConstPtr            GetType()const;
 62                 VInt                            GetCount()const;
 63             };
 64 
 65             class VL_AlignStruct : public VL_AlignType
 66             {
 67             protected:
 68                 mutable VL_AlignMember::List    FMembers;
 69                 mutable VInt                    FSize;
 70                 mutable VInt                    FAlignment;
 71             public:
 72                 VL_AlignStruct();
 73 
 74                 VInt                            GetSize()const;
 75                 VInt                            GetAlignment()const;
 76                 void                            AddMember(VL_AlignType::Ptr Type);
 77                 void                            InsertMember(VInt Index , VL_AlignType::Ptr Type);
 78                 void                            DeleteMember(VInt Index);
 79                 VInt                            GetMemberCount()const;
 80                 const VL_AlignMember&            GetMember(VInt Index)const;
 81                 void                            Refresh()const;
 82             };
 83 
 84             enum VLE_AlignBasicType
 85             {
 86                 vabtInt8,
 87                 vabtInt16,
 88                 vabtInt32,
 89                 vabtAsciiChar,
 90                 vabtWideChar,
 91                 vabtFloat,
 92                 vabtDouble
 93             };
 94             class VL_AlignBasic : public VL_AlignType
 95             {
 96             protected:
 97                 VLE_AlignBasicType                FType;
 98             public:
 99                 VL_AlignBasic(VLE_AlignBasicType Type);
100 
101                 VInt                            GetSize()const;
102                 VInt                            GetAlignment()const;
103                 VLE_AlignBasicType                GetType()const;
104             };
105         }
106     }
107 }
108 
109 #endif

    實現文件:
  1 #include "VL_JIT_MemberAlignment.h"
  2 
  3 namespace vl
  4 {
  5     namespace jit
  6     {
  7         namespace alignment
  8         {
  9             VInt Align(VInt Offset , VInt Alignment)
 10             {
 11                 if(Alignment==0)
 12                 {
 13                     Alignment=1;
 14                 }
 15                 return (Offset+Alignment-1)/Alignment*Alignment;
 16             }
 17 
 18 /*********************************************************************************************************
 19 VL_AlignMember
 20 *********************************************************************************************************/
 21 
 22             VL_AlignMember::VL_AlignMember()
 23             {
 24                 FMinOffset=0;
 25             }
 26 
 27             VL_AlignType::ConstPtr VL_AlignMember::GetType()const
 28             {
 29                 return FType;
 30             }
 31 
 32             void VL_AlignMember::SetType(VL_AlignType::Ptr Type)
 33             {
 34                 FType=Type;
 35             }
 36 
 37             VInt VL_AlignMember::GetOffset()const
 38             {
 39                 return Align(FMinOffset,FType->GetAlignment());
 40             }
 41 
 42             void VL_AlignMember::SetMinOffset(VInt MinOffset)
 43             {
 44                 FMinOffset=MinOffset;
 45             }
 46 
 47 /*********************************************************************************************************
 48 VL_AlignArray
 49 *********************************************************************************************************/
 50 
 51             VL_AlignArray::VL_AlignArray(VL_AlignType::Ptr Type , VInt Count)
 52             {
 53                 FType=Type;
 54                 FCount=Count;
 55             }
 56 
 57             VInt VL_AlignArray::GetSize()const
 58             {
 59                 return FType->GetSize()*FCount;
 60             }
 61             
 62             VInt VL_AlignArray::GetAlignment()const
 63             {
 64                 return FType->GetAlignment();
 65             }
 66 
 67             VL_AlignType::ConstPtr VL_AlignArray::GetType()const
 68             {
 69                 return FType;
 70             }
 71 
 72             VInt VL_AlignArray::GetCount()const
 73             {
 74                 return FCount;
 75             }
 76 
 77 /*********************************************************************************************************
 78 VL_AlignStruct
 79 *********************************************************************************************************/
 80 
 81             VL_AlignStruct::VL_AlignStruct()
 82             {
 83                 Refresh();
 84             }
 85 
 86             VInt VL_AlignStruct::GetSize()const
 87             {
 88                 return FSize;
 89             }
 90 
 91             VInt VL_AlignStruct::GetAlignment()const
 92             {
 93                 return FAlignment;
 94             }
 95 
 96             void VL_AlignStruct::AddMember(VL_AlignType::Ptr Type)
 97             {
 98                 VL_AlignMember Member;
 99                 Member.SetType(Type);
100                 FMembers.Add(Member);
101                 Refresh();
102             }
103 
104             void VL_AlignStruct::InsertMember(VInt Index , VL_AlignType::Ptr Type)
105             {
106                 VL_AlignMember Member;
107                 Member.SetType(Type);
108                 FMembers.Insert(Index,Member);
109                 Refresh();
110             }
111 
112             void VL_AlignStruct::DeleteMember(VInt Index)
113             {
114                 FMembers.Delete(Index);
115                 Refresh();
116             }
117 
118             VInt VL_AlignStruct::GetMemberCount()const
119             {
120                 return FMembers.GetCount();
121             }
122 
123             const VL_AlignMember& VL_AlignStruct::GetMember(VInt Index)const
124             {
125                 return FMembers[Index];
126             }
127 
128             void VL_AlignStruct::Refresh()const
129             {
130                 FSize=0;
131                 FAlignment=0;
132                 for(VInt i=0;i<FMembers.GetCount();i++)
133                 {
134                     if(FAlignment<FMembers[i].GetType()->GetAlignment())
135                     {
136                         FAlignment=FMembers[i].GetType()->GetAlignment();
137                     }
138                     FMembers[i].SetMinOffset(FSize);
139                     FSize=FMembers[i].GetOffset()+FMembers[i].GetType()->GetSize();
140                 }
141                 FSize=Align(FSize,FAlignment);
142                 if(FSize==0)
143                 {
144                     FAlignment=1;
145                     FSize=1;
146                 }
147             }
148 
149 /*********************************************************************************************************
150 VL_AlignBasic
151 *********************************************************************************************************/
152 
153             VL_AlignBasic::VL_AlignBasic(VLE_AlignBasicType Type)
154             {
155                 FType=Type;
156             }
157 
158             VInt VL_AlignBasic::GetSize()const
159             {
160                 switch(FType)
161                 {
162                 case vabtInt8:        return sizeof(VInt8s);
163                 case vabtInt16:        return sizeof(VInt16s);
164                 case vabtInt32:        return sizeof(VInt32s);
165                 case vabtAsciiChar:    return sizeof(VChar);
166                 case vabtWideChar:    return sizeof(VWChar);
167                 case vabtFloat:        return sizeof(VFloat);
168                 case vabtDouble:    return sizeof(VDouble);
169                 default:            return 0;
170                 }
171             }
172 
173             VInt VL_AlignBasic::GetAlignment()const
174             {
175                 return GetSize();
176             }
177 
178             VLE_AlignBasicType VL_AlignBasic::GetType()const
179             {
180                 return FType;
181             }
182         }
183     }
184 }
posted on 2009-03-09 20:46 陳梓瀚(vczh) 閱讀(3768) 評論(2)  編輯 收藏 引用 所屬分類: JIT

評論:
# re: JIT腳本引擎:成員對齊詳解 2009-03-09 21:00 | jiong
囧o(╯□╰)o  回復  更多評論
  
# re: JIT腳本引擎:成員對齊詳解 2009-03-10 03:36 | 123
強啊!  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美一区二区三区成人| 欧美区一区二区三区| 久久国产精品高清| 亚洲欧美经典视频| 亚洲美女毛片| 亚洲综合首页| 久久精品日韩欧美| 免费观看亚洲视频大全| 欧美黄色一区二区| 亚洲精品在线观看免费| 亚洲精品资源| 日韩性生活视频| 亚洲大片一区二区三区| 久热国产精品| 一本色道综合亚洲| 久久av二区| 欧美日韩国产999| 国产日本欧美在线观看 | 亚洲精品在线免费| 99在线视频精品| 国产亚洲视频在线| 午夜在线视频观看日韩17c| 一区二区欧美国产| 国产精品久久综合| 蜜臀av在线播放一区二区三区| 亚洲一区二区免费在线| 麻豆国产精品777777在线 | 亚洲欧美网站| 国产欧美视频一区二区| 欧美综合第一页| 午夜精品999| 国产婷婷色一区二区三区| 亚洲男人第一av网站| 亚洲第一页在线| 欧美激情一二区| 亚洲一区区二区| 亚洲欧洲一区二区三区在线观看| 久久久水蜜桃| 亚洲第一中文字幕| 欧美激情精品久久久久久大尺度| 欧美一区不卡| 在线日本成人| 在线亚洲伦理| 久久riav二区三区| 国产综合色在线| 麻豆国产va免费精品高清在线| 久久精品国产久精国产思思| 国产女主播一区二区| 欧美高清在线一区二区| 国产亚洲欧美日韩一区二区| 一区二区免费在线播放| 亚洲桃色在线一区| 国产精品国产三级国产aⅴ浪潮 | aⅴ色国产欧美| 国产精品人成在线观看免费| 欧美 日韩 国产在线| 国产一区成人| 亚洲欧洲一区二区三区| 99re热这里只有精品视频| 久久蜜臀精品av| 免费永久网站黄欧美| 亚洲黄色免费电影| 欧美精品999| 亚洲综合成人在线| 久久一区二区三区国产精品| 欧美一区二区女人| 久久久国产精彩视频美女艺术照福利 | 国产精自产拍久久久久久| 亚洲人成亚洲人成在线观看| 欧美不卡在线| 欧美精品激情在线| 一区二区三区www| 久久频这里精品99香蕉| 亚洲三级电影全部在线观看高清| 另类av导航| 日韩亚洲在线观看| 午夜久久福利| 亚洲视频www| 欧美一区二区高清| 日韩一级网站| 午夜欧美大片免费观看| 香蕉成人久久| 亚洲欧洲精品一区二区三区不卡 | 麻豆九一精品爱看视频在线观看免费| 最新国产の精品合集bt伙计| 免费毛片一区二区三区久久久| 亚洲激情综合| 伊人精品久久久久7777| 亚洲欧美日韩国产综合| 亚洲天堂网在线观看| 久久精品国产久精国产思思| 亚洲午夜国产成人av电影男同| 日韩午夜在线播放| 日韩亚洲欧美精品| 亚洲高清二区| 欧美日韩精品福利| 久久精品夜色噜噜亚洲a∨ | 中日韩视频在线观看| 国产视频精品网| 欧美大片免费久久精品三p| 欧美精品一区二区三区在线看午夜| 亚洲一区二区精品| 久久男人资源视频| 亚洲欧美日韩一区二区三区在线观看 | 亚洲影院免费| 久久综合五月| 欧美精品一区二区三区高清aⅴ| 欧美在线观看视频| 久久久久青草大香线综合精品| 在线视频欧美日韩精品| 性视频1819p久久| 一本色道久久综合亚洲91| 欧美在线视频导航| 亚洲综合精品四区| 欧美 日韩 国产在线| 久久久久久精| 国产精品手机视频| 亚洲毛片在线观看| 亚洲国产影院| 久久久国产一区二区| 性久久久久久久久| 欧美体内谢she精2性欧美| 亚洲二区视频在线| 一区在线视频| 久久精品91| 久久久久久久久岛国免费| 国产精品免费一区二区三区观看| 亚洲国产精品成人综合| 亚洲成人资源网| 久久精品国产亚洲一区二区三区| 亚洲一区一卡| 欧美手机在线| 一本色道久久综合狠狠躁篇怎么玩 | 国产精品一级| 宅男66日本亚洲欧美视频| 日韩视频专区| 欧美激情影音先锋| 亚洲欧洲精品一区二区三区 | 亚洲一区二区综合| 亚洲欧美国产77777| 欧美午夜宅男影院| 亚洲一级在线观看| 欧美在线一区二区三区| 国产精品婷婷午夜在线观看| 亚洲午夜电影| 久久精品国内一区二区三区| 国产日韩在线一区二区三区| 欧美伊人精品成人久久综合97| 久久成人精品| 在线日韩av永久免费观看| 久久尤物电影视频在线观看| 欧美18av| 一区二区三区国产| 国产精品每日更新| 欧美在线一二三| 欧美国产精品一区| 中日韩男男gay无套| 国产精品夜夜夜| 久久乐国产精品| 亚洲精品综合久久中文字幕| 亚洲视频 欧洲视频| 国产色综合久久| 久久一日本道色综合久久| 亚洲国产欧美精品| 久久av一区二区三区| 亚洲国产视频直播| 国产精品久久久久国产a级| 久久国产66| 亚洲一区影音先锋| 亚洲精品日韩精品| 99在线观看免费视频精品观看| 欧美日韩在线三区| 香蕉久久a毛片| 欧美国产精品一区| 亚洲欧美日韩国产综合在线| 伊人影院久久| 国产精品国产自产拍高清av| 久久久精品国产一区二区三区| 亚洲区欧美区| 久久久久免费观看| 一区二区三区产品免费精品久久75| 国产欧美日韩一区| 欧美激情精品久久久久久久变态| 亚洲在线成人| 亚洲精品三级| 欧美**人妖| 久久久蜜桃精品| 亚洲欧美视频在线| 99在线精品免费视频九九视| 在线日韩日本国产亚洲| 国产精品午夜久久| 欧美日韩国产123| 久久影院午夜片一区| 欧美亚洲午夜视频在线观看| 亚洲精品乱码久久久久久按摩观 | 精品成人久久| 国产精品亚洲网站| 欧美日韩在线观看一区二区三区 | 久久成人18免费网站| 亚洲网友自拍|