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

隨筆-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>
            国产精品免费福利| 亚洲网站在线播放| 美国十次成人| 亚洲国产精选| 最新日韩欧美| 国产精品高潮呻吟久久| 性高湖久久久久久久久| 欧美中文字幕不卡| 亚洲精品国产精品国产自| 亚洲欧洲在线一区| 国产精品日韩欧美大师| 久久综合色影院| 欧美激情偷拍| 午夜精品国产更新| 久久三级视频| 亚洲少妇诱惑| 久久久99精品免费观看不卡| 久久精品理论片| 亚洲精品视频一区| 亚洲一区二区三区免费观看| 韩国在线视频一区| 亚洲精品在线观| 国内精品久久久久久久影视蜜臀| 欧美岛国激情| 国产嫩草一区二区三区在线观看| 老司机成人网| 国产精品久久9| 欧美sm视频| 国产乱子伦一区二区三区国色天香| 欧美sm重口味系列视频在线观看| 国产精品久久久久久久7电影| 老巨人导航500精品| 国产精品成人播放| 欧美激情a∨在线视频播放| 国产精品国产自产拍高清av王其 | 亚洲另类自拍| 久久精品视频va| 亚洲欧美电影在线观看| 欧美成人午夜影院| 狼狼综合久久久久综合网| 国产精品捆绑调教| 亚洲美女中文字幕| 亚洲精品人人| 老司机精品视频一区二区三区| 午夜精品久久久久| 欧美人与性动交α欧美精品济南到| 久久久国产精品亚洲一区| 欧美视频一区二区三区…| 欧美激情网站在线观看| 亚洲第一精品福利| 欧美专区亚洲专区| 午夜一级久久| 国产精品毛片在线看| 亚洲欧洲在线看| 亚洲免费观看| 欧美日韩高清不卡| 亚洲人成网站在线播| 亚洲欧洲日本一区二区三区| 久久国产精品亚洲77777| 欧美在线看片| 国产亚洲欧美激情| 欧美在线日韩| 麻豆九一精品爱看视频在线观看免费| 国产老肥熟一区二区三区| 亚洲自拍三区| 久久激情视频久久| 国产综合久久久久久鬼色| 午夜亚洲性色福利视频| 欧美在线视频a| 国内自拍一区| 久久久久久亚洲精品中文字幕| 裸体丰满少妇做受久久99精品| 国模 一区 二区 三区| 久久精品卡一| 欧美成人免费全部观看天天性色| 在线观看视频亚洲| 免费精品99久久国产综合精品| 亚洲福利久久| 亚洲深夜福利网站| 国产精品少妇自拍| 欧美一区二区三区免费在线看| 久久婷婷人人澡人人喊人人爽| 亚洲电影免费在线观看| 中文国产成人精品久久一| 午夜精品久久久久久久99樱桃| 国产精品一区免费在线观看| 午夜久久美女| 欧美成人综合一区| 一本色道久久综合亚洲精品不| 国产精品高清一区二区三区| 午夜久久99| 亚洲国产欧美久久| 午夜精品久久久久久久久久久 | 欧美视频二区| 午夜电影亚洲| 亚洲高清不卡在线| 亚洲欧美日本视频在线观看| 激情综合色综合久久综合| 欧美xart系列高清| 亚洲伊人第一页| 欧美护士18xxxxhd| 欧美一区二区三区另类| 在线观看视频一区二区欧美日韩| 欧美手机在线| 久久先锋影音av| 在线中文字幕不卡| 欧美 日韩 国产在线 | 日韩亚洲国产欧美| 国产一区二区看久久| 欧美喷潮久久久xxxxx| 欧美亚洲三级| 一区二区高清视频| 欧美肥婆在线| 久久精品人人做人人爽| 在线中文字幕不卡| 亚洲国产一区二区三区高清| 国产精品一级久久久| 欧美精品在线观看| 久久精品综合网| 亚洲欧美综合v| 日韩视频在线免费观看| 欧美激情第六页| 久久亚洲国产成人| 欧美在线亚洲在线| 亚洲无线视频| 艳女tv在线观看国产一区| 在线日本成人| 极品裸体白嫩激情啪啪国产精品| 国产精品国产三级国产aⅴ浪潮 | 欧美日韩日韩| 欧美高清自拍一区| 免费日本视频一区| 久久久久久久久久久久久9999| 亚洲女同精品视频| 亚洲一区尤物| 午夜精品久久久久久久久| 一本色道久久88综合日韩精品| 亚洲黄色一区| 亚洲国产福利在线| 亚洲国产精品va在线看黑人动漫| 美女啪啪无遮挡免费久久网站| 久久精品国产v日韩v亚洲| 欧美一级久久久| 久久精品72免费观看| 久久www成人_看片免费不卡| 久久av一区二区三区漫画| 欧美一级久久久| 久久精品欧洲| 欧美成人一区二区| 亚洲人成人一区二区在线观看| 最新日韩av| 中文在线资源观看网站视频免费不卡| 一区电影在线观看| 欧美一区二区黄| 老巨人导航500精品| 99热免费精品| 亚洲欧美99| 久久婷婷亚洲| 欧美激情免费观看| 欧美三日本三级三级在线播放| 欧美午夜精品久久久| 国产伦精品一区二区三区免费| 国产视频观看一区| 亚洲高清在线观看| 日韩图片一区| 亚洲午夜伦理| 久久国产毛片| 欧美激情一区二区三区不卡| 亚洲人成在线播放网站岛国| 亚洲图片欧洲图片av| 欧美一区二区三区在线播放| 久久久久久久久一区二区| 欧美激情视频一区二区三区免费| 欧美视频不卡| 在线观看一区二区精品视频| 99热在这里有精品免费| 欧美一区二区视频观看视频| 欧美18av| 亚洲夜间福利| 久久五月天婷婷| 国产精品日韩欧美| 亚洲国产精品久久久久婷婷884 | 亚洲在线成人| 鲁大师影院一区二区三区| 欧美日韩亚洲国产精品| 国产主播一区二区| 一区二区欧美视频| 欧美99久久| 亚洲欧美一区二区激情| 男人的天堂亚洲| 国产亚洲成精品久久| 99视频精品在线| 麻豆成人综合网| 亚洲在线视频| 欧美日本精品在线| 最新日韩欧美| 蜜臀av性久久久久蜜臀aⅴ| 亚洲免费婷婷| 国产精品九色蝌蚪自拍| 一区二区欧美日韩|