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

隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
    根據(jù)之前的文章的討論,Vczh Library++3.0泛型全局存儲(chǔ)是一個(gè)大型的映射。假設(shè)你有下面的代碼:
1 generic<T>
2 structure StorageType
3 {
4   wchar* name;
5   T data;
6 }
7 
8 generic<T>
9 variable StoragetType<T> storage;

    那么當(dāng)你在使用storage<int>和storage<bool>的時(shí)候,實(shí)際上是在使用兩個(gè)不同的全局變量。但是當(dāng)你的storage實(shí)現(xiàn)在assembly A里面的時(shí)候,assembly B和assembly C里面所看到的&storage<int>是一樣的。因此為storage<T>分配空間實(shí)際上是虛擬機(jī)做的事情。這里的assembly ABC可以看成是跟dll差不多的東西。

    這次實(shí)現(xiàn)了泛型全局存儲(chǔ)之后,我還開發(fā)了一個(gè)新的Log函數(shù)用來把虛擬機(jī)的內(nèi)部狀態(tài)全部都log出來。虛擬機(jī)在加載一個(gè)二進(jìn)制的assembly之后,首先會(huì)對它進(jìn)行鏈接,其具體的做法就是對指令進(jìn)行修改。而當(dāng)指令要求特化一些泛型函數(shù)或泛型全局存儲(chǔ)的同時(shí),虛擬機(jī)會(huì)在一個(gè)內(nèi)部創(chuàng)建的assembly為這些實(shí)例化的東西分配空間。因此在執(zhí)行了UnitTest之后,可以看到鏈接前和鏈接后的assembly,以及虛擬機(jī)為了鏈接他們而保存的數(shù)據(jù)結(jié)構(gòu)。現(xiàn)在我們來看一個(gè)例子。這個(gè)例子很簡單,兩個(gè)assembly包含下面的內(nèi)容:
    1、storage<T>的聲明
    2、Get<T>函數(shù)用于讀取
    3、Set<T>函數(shù)用于寫入
    然后main函數(shù)會(huì)分別通過直接讀寫、以及利用Get<T>和Set<T>進(jìn)行間接讀寫的方法(用于檢查特化后的模板函數(shù)對泛型全局存儲(chǔ)的操作),對storage<int>和storage<char>寫入兩個(gè)值,讀出來相加,最后返回結(jié)果。首先看代碼:

1:programStorage.txt
 1 /*NativeX Code*/
 2 unit nativex_program_generated;
 3 generic<T>
 4 structure Storage
 5 {
 6     T data;
 7 }
 8 
 9 generic<U>
10 variable Storage<U> storage;
11 
12 generic<V>
13 function V Get()
14     (result = storage<V>.data);

2:programMain.txt
 1 /*NativeX Code*/
 2 unit nativex_program_generated;
 3 generic<T>
 4 structure Storage alias programStorage.Storage
 5 {
 6     T data;
 7 }
 8 
 9 generic<U>
10 variable Storage<U> storage alias programStorage.storage;
11 
12 generic<V>
13 function V Get() alias programStorage.Get;
14 
15 function int32 main()
16 {
17     (storage<int32>.data = 10s32);
18     Set<char>('');
19     variable int32 a = Get<int32>();
20     variable int32 b = storage<char>.data;
21     (result = (a + b));
22 }
23 
24 generic<W>
25 function void Set(W value)
26     (storage<W>.data = value);

    然后是他們產(chǎn)生的二進(jìn)制程序集(鏈接前)的內(nèi)容,以及虛擬機(jī)在執(zhí)行完所有代碼之后所產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)和那兩個(gè)二進(jìn)制程序集在鏈接后的內(nèi)容:

1:programStorage
 1 /*NativeX Code*/
 2 unit nativex_program_generated;
 3 generic<T>
 4 structure Storage
 5 {
 6     T data;
 7 }
 8 
 9 generic<U>
10 variable Storage<U> storage;
11 
12 generic<V>
13 function V Get()
14     (result = storage<V>.data);
15 
16 
17 /*Assembly*/
18 .data
19 .label
20      0: instruction 3
21 .code
22 // unit nativex_program_generated;
23      0: stack_reserve 0
24      1: stack_reserve 0
25      2: ret 0
26 // function V Get()
27      3: stack_reserve 0
28 // (result = storage<V>.data);
29      4: generic_pushdata 0
30      5: push s32 0
31      6: add s32
32      7: resptr
33      8: copymem 0[Linear]
34 // function V Get()
35      9: stack_reserve 0
36     10: ret 0
37 .exports
38 Assembly Name: programStorage
39 Function Entries[0= {
40   Name = Get
41   Arguments = 1
42   Instruction = 3
43   Lengtht = 8
44   UniqueName = [programStorage]::[Get]
45 }
46 Variable Entries[0= {
47   Name = storage
48   Arguments = 1
49   Size = 1*T0 + 0
50   UniqueName = [programStorage]::[storage]
51 }
52 Targets[0= {
53   AssemblyName = programStorage
54   SymbolName = storage
55   ArgumentSizes[0= 1*T0 + 0
56   ArgumentNames[0= {0}
57 }
58 Linears[0= 1*T0 + 0
59 

2:programMain
  1 /*NativeX Code*/
  2 unit nativex_program_generated;
  3 generic<T>
  4 structure Storage alias programStorage.Storage
  5 {
  6     T data;
  7 }
  8 
  9 generic<U>
 10 variable Storage<U> storage alias programStorage.storage;
 11 
 12 generic<V>
 13 function V Get() alias programStorage.Get;
 14 
 15 function int32 main()
 16 {
 17     (storage<int32>.data = 10s32);
 18     Set<char>('');
 19     variable int32 a = Get<int32>();
 20     variable int32 b = storage<char>.data;
 21     (result = (a + b));
 22 }
 23 
 24 generic<W>
 25 function void Set(W value)
 26     (storage<W>.data = value);
 27 
 28 
 29 /*Assembly*/
 30 .data
 31 .label
 32      0: instruction 3
 33      1: instruction 32
 34 .code
 35 // unit nativex_program_generated;
 36      0: stack_reserve 0
 37      1: stack_reserve 0
 38      2: ret 0
 39 // function int32 main()
 40      3: stack_reserve 8
 41 // (storage<int32>.data = 10s32);
 42      4: push s32 10
 43      5: generic_pushdata 0
 44      6: push s32 0
 45      7: add s32
 46      8: write s32
 47 // Set<char>('');
 48      9: stack_reserve 1
 49     10: push s8 20
 50     11: stack_top 1
 51     12: generic_callfunc 1
 52     13: stack_reserve -1
 53 // variable int32 a = Get<int32>();
 54     14: stack_offset -4
 55     15: generic_callfunc 2
 56 // variable int32 b = storage<char>.data;
 57     16: generic_pushdata 3
 58     17: push s32 0
 59     18: add s32
 60     19: read s8
 61     20: convert s32 s8
 62     21: stack_offset -8
 63     22: write s32
 64 // (result = (a + b));
 65     23: stack_offset -8
 66     24: read s32
 67     25: stack_offset -4
 68     26: read s32
 69     27: add s32
 70     28: resptr
 71     29: write s32
 72 // function int32 main()
 73     30: stack_reserve -8
 74     31: ret 0
 75 // function void Set(W value)
 76     32: stack_reserve 0
 77 // (storage<W>.data = value);
 78     33: stack_offset 16
 79     34: generic_pushdata 4
 80     35: push s32 0
 81     36: add s32
 82     37: copymem 0[Linear]
 83 // function void Set(W value)
 84     38: stack_reserve 0
 85     39: ret 0[Linear]
 86 .exports
 87 Assembly Name: programMain
 88 Exports[0= (3, main)
 89 Function Entries[0= {
 90   Name = Set
 91   Arguments = 1
 92   Instruction = 32
 93   Lengtht = 8
 94   UniqueName = [programMain]::[Set]
 95 }
 96 Targets[0= {
 97   AssemblyName = programStorage
 98   SymbolName = storage
 99   ArgumentSizes[0= 4
100   ArgumentNames[0= s32
101 }
102 Targets[1= {
103   AssemblyName = programMain
104   SymbolName = Set
105   ArgumentSizes[0= 1
106   ArgumentNames[0= char_type
107 }
108 Targets[2= {
109   AssemblyName = programStorage
110   SymbolName = Get
111   ArgumentSizes[0= 4
112   ArgumentNames[0= s32
113 }
114 Targets[3= {
115   AssemblyName = programStorage
116   SymbolName = storage
117   ArgumentSizes[0= 1
118   ArgumentNames[0= char_type
119 }
120 Targets[4= {
121   AssemblyName = programStorage
122   SymbolName = storage
123   ArgumentSizes[0= 1*T0 + 0
124   ArgumentNames[0= {0}
125 }
126 Linears[0= 1*T0 + 0
127 

3:虛擬機(jī)
  1 -----------------------------------------------
  2 Loaded Assemblies[0]
  3 -----------------------------------------------
  4 .data
  5 .label
  6 .code
  7      0: stack_reserve 0
  8      1: stack_offset 16
  9      2: push u32 11268052
 10      3: push s32 0
 11      4: add s32
 12      5: copymem 1
 13      6: stack_reserve 0
 14      7: ret 1
 15      8: stack_reserve 0
 16      9: push u32 11268048
 17     10: push s32 0
 18     11: add s32
 19     12: resptr
 20     13: copymem 4
 21     14: stack_reserve 0
 22     15: ret 0
 23 
 24 -----------------------------------------------
 25 Loaded Assemblies[1]
 26 -----------------------------------------------
 27 .data
 28 .label
 29      0: instruction 3
 30 .code
 31      0: stack_reserve 0
 32      1: stack_reserve 0
 33      2: ret 0
 34      3: stack_reserve 0
 35      4: generic_pushdata 0
 36      5: push s32 0
 37      6: add s32
 38      7: resptr
 39      8: copymem 0[Linear]
 40      9: stack_reserve 0
 41     10: ret 0
 42 .exports
 43 Assembly Name: programStorage
 44 Function Entries[0= {
 45   Name = Get
 46   Arguments = 1
 47   Instruction = 3
 48   Lengtht = 8
 49   UniqueName = [programStorage]::[Get]
 50 }
 51 Variable Entries[0= {
 52   Name = storage
 53   Arguments = 1
 54   Size = 1*T0 + 0
 55   UniqueName = [programStorage]::[storage]
 56 }
 57 Targets[0= {
 58   AssemblyName = programStorage
 59   SymbolName = storage
 60   ArgumentSizes[0= 1*T0 + 0
 61   ArgumentNames[0= {0}
 62 }
 63 Linears[0= 1*T0 + 0
 64 
 65 -----------------------------------------------
 66 Loaded Assemblies[2]
 67 -----------------------------------------------
 68 .data
 69 .label
 70      0: instruction 3
 71      1: instruction 32
 72 .code
 73      0: stack_reserve 0
 74      1: stack_reserve 0
 75      2: ret 0
 76      3: stack_reserve 8
 77      4: push s32 10
 78      5: push u32 11268048
 79      6: push s32 0
 80      7: add s32
 81      8: write s32
 82      9: stack_reserve 1
 83     10: push s8 20
 84     11: stack_top 1
 85     12: call 0 0
 86     13: stack_reserve -1
 87     14: stack_offset -4
 88     15: call 8 0
 89     16: push u32 11268052
 90     17: push s32 0
 91     18: add s32
 92     19: read s8
 93     20: convert s32 s8
 94     21: stack_offset -8
 95     22: write s32
 96     23: stack_offset -8
 97     24: read s32
 98     25: stack_offset -4
 99     26: read s32
100     27: add s32
101     28: resptr
102     29: write s32
103     30: stack_reserve -8
104     31: ret 0
105     32: stack_reserve 0
106     33: stack_offset 16
107     34: generic_pushdata 4
108     35: push s32 0
109     36: add s32
110     37: copymem 0[Linear]
111     38: stack_reserve 0
112     39: ret 0[Linear]
113 .exports
114 Assembly Name: programMain
115 Exports[0= (3, main)
116 Function Entries[0= {
117   Name = Set
118   Arguments = 1
119   Instruction = 32
120   Lengtht = 8
121   UniqueName = [programMain]::[Set]
122 }
123 Targets[0= {
124   AssemblyName = programStorage
125   SymbolName = storage
126   ArgumentSizes[0= 4
127   ArgumentNames[0= s32
128 }
129 Targets[1= {
130   AssemblyName = programMain
131   SymbolName = Set
132   ArgumentSizes[0= 1
133   ArgumentNames[0= char_type
134 }
135 Targets[2= {
136   AssemblyName = programStorage
137   SymbolName = Get
138   ArgumentSizes[0= 4
139   ArgumentNames[0= s32
140 }
141 Targets[3= {
142   AssemblyName = programStorage
143   SymbolName = storage
144   ArgumentSizes[0= 1
145   ArgumentNames[0= char_type
146 }
147 Targets[4= {
148   AssemblyName = programStorage
149   SymbolName = storage
150   ArgumentSizes[0= 1*T0 + 0
151   ArgumentNames[0= {0}
152 }
153 Linears[0= 1*T0 + 0
154 
155 -----------------------------------------------
156 Assembly Name Map
157 -----------------------------------------------
158 programMain = 2
159 programStorage = 1
160 
161 -----------------------------------------------
162 Function Pointer Map
163 -----------------------------------------------
164 0 = Assemblies[-1].Instructions[-1]
165 1 = Assemblies[1].Instructions[3]
166 2 = Assemblies[2].Instructions[3]
167 3 = Assemblies[2].Instructions[32]
168 4 = Assemblies[0].Instructions[0]
169 5 = Assemblies[0].Instructions[8]
170 
171 -----------------------------------------------
172 Loaded Symbol Names
173 -----------------------------------------------
174 programMain.main
175 
176 -----------------------------------------------
177 Generic Function Entry Map
178 -----------------------------------------------
179 programMain.Set
180   Instruction = 32
181   Count = 8
182   Assembly = 2
183   Generic Argument Count = 1
184   Unique Entry ID = [programMain]::[Set]
185 programStorage.Get
186   Instruction = 3
187   Count = 8
188   Assembly = 1
189   Generic Argument Count = 1
190   Unique Entry ID = [programStorage]::[Get]
191 
192 -----------------------------------------------
193 Generic Variable Entry Map
194 -----------------------------------------------
195 programStorage.storage
196   Generic Argument Count = 1
197   Size = 1*T0 + 0
198   Unique Entry ID = [programStorage]::[storage]
199 
200 -----------------------------------------------
201 Instanciated Generic Function Map
202 -----------------------------------------------
203 [programMain]::[Set]<char_type> = 4
204 [programStorage]::[Get]<s32> = 5
205 
206 -----------------------------------------------
207 Instanciated Generic Variable Map
208 -----------------------------------------------
209 [programStorage]::[storage]<char_type> = 11268052
210 [programStorage]::[storage]<s32> = 11268048
211 
212 -----------------------------------------------
213 Cached Generic Target List
214 -----------------------------------------------
215 Assembly Name = programStorage
216 Symbol Name = storage
217 Arguments = {
218   Argument[0= {
219     Name = s32
220     Size = 4
221   }
222 }
223 Assembly Name = programMain
224 Symbol Name = Set
225 Arguments = {
226   Argument[0= {
227     Name = char_type
228     Size = 1
229   }
230 }
231 Assembly Name = programStorage
232 Symbol Name = storage
233 Arguments = {
234   Argument[0= {
235     Name = char_type
236     Size = 1
237   }
238 }
239 Assembly Name = programStorage
240 Symbol Name = Get
241 Arguments = {
242   Argument[0= {
243     Name = s32
244     Size = 4
245   }
246 }
247 Assembly Name = programStorage
248 Symbol Name = storage
249 Arguments = {
250   Argument[0= {
251     Name = s32
252     Size = 4
253   }
254 }
255 Assembly Name = programStorage
256 Symbol Name = storage
257 Arguments = {
258   Argument[0= {
259     Name = char_type
260     Size = 1
261   }
262 }
263 
264 

    如果仔細(xì)觀察的話你會(huì)發(fā)現(xiàn)我暫時(shí)還沒有對中間的數(shù)據(jù)結(jié)構(gòu)進(jìn)行優(yōu)化,導(dǎo)致有時(shí)候會(huì)產(chǎn)生重復(fù)的信息。不過優(yōu)化也是遲早的事情,現(xiàn)在先做功能,太早優(yōu)化是魔鬼也。

    最新的代碼可以在這里獲得。
posted on 2010-07-17 21:28 陳梓瀚(vczh) 閱讀(2995) 評(píng)論(2)  編輯 收藏 引用 所屬分類: VL++3.0開發(fā)紀(jì)事

評(píng)論:
# re: Vczh Library++ 3.0實(shí)現(xiàn)泛型全局存儲(chǔ) 2010-07-20 06:53 | 全圖靈死程
# re: Vczh Library++ 3.0實(shí)現(xiàn)泛型全局存儲(chǔ) 2010-08-08 23:19 | 文殊廣法
太深?yuàn)W,看不懂。  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美激情久久久| 亚洲欧洲美洲综合色网| 久久久精品一区| 亚洲自拍三区| 宅男噜噜噜66一区二区66| 亚洲欧洲精品一区二区三区不卡| 午夜欧美视频| 午夜精品久久久久久99热| 亚洲欧美日韩一区在线| 久久大综合网| 欧美电影免费观看大全| 亚洲第一级黄色片| 一本久道久久综合狠狠爱| 一区二区三区www| 亚洲欧美影音先锋| 久久久久久自在自线| 欧美激情一区二区三区在线视频观看 | 久久综合久久综合这里只有精品| 欧美一区1区三区3区公司| 欧美在线播放一区| 久久久久成人精品免费播放动漫| 久久婷婷综合激情| 亚洲精品一二三| 午夜视频精品| 欧美激情第五页| 国产色综合天天综合网| 亚洲国产欧洲综合997久久| 99精品99| 久久理论片午夜琪琪电影网| 亚洲精品乱码久久久久久按摩观| 亚洲自拍三区| 蜜桃av综合| 国产精品夜夜夜| 亚洲国产第一| 欧美自拍偷拍午夜视频| 亚洲日本中文| 久久乐国产精品| 欧美日韩中文另类| 在线观看视频一区| 先锋资源久久| 亚洲精品乱码久久久久久久久| 亚洲欧美欧美一区二区三区| 欧美福利一区二区三区| 国产欧美一区二区精品婷婷| 亚洲日本成人在线观看| 欧美中文字幕在线播放| 亚洲国产精品va| 久久天天狠狠| 国内精品伊人久久久久av一坑| 一本久久精品一区二区| 欧美好吊妞视频| 夜夜嗨av一区二区三区四区 | 亚洲视频一区二区在线观看 | 久久一区亚洲| 国产亚洲精品bv在线观看| 一区二区成人精品| 亚洲高清免费| 久久全国免费视频| 国内揄拍国内精品久久| 欧美一区二区三区在线观看| 一本色道久久综合一区| 欧美日本高清| 午夜精品久久久久99热蜜桃导演| 久久www成人_看片免费不卡| 亚洲精品精选| 麻豆精品在线播放| 欧美一区二区精品在线| 国产精品成人免费| 亚洲综合欧美| 亚洲欧美高清| 国产毛片久久| 久久激情中文| 亚洲一区二区三区在线| 欧美视频不卡| 欧美影院成人| 欧美亚洲日本一区| 国产麻豆精品在线观看| 欧美专区在线观看一区| 欧美在线免费| 亚洲电影天堂av| 91久久国产综合久久| 欧美日韩国产不卡| 亚洲欧美在线一区二区| 午夜国产精品视频| 亚洲国产精品久久久久久女王| 亚洲春色另类小说| 欧美三区在线观看| 久久久久国产一区二区| 欧美不卡在线| 亚洲午夜精品| 亚洲一区二三| 在线观看不卡av| 亚洲风情亚aⅴ在线发布| 国产精品h在线观看| 久久久久网站| 欧美喷潮久久久xxxxx| 亚洲欧美日韩综合国产aⅴ| 欧美一级大片在线观看| 亚洲级视频在线观看免费1级| 一本色道综合亚洲| 在线欧美亚洲| 一区二区三区你懂的| 韩国精品久久久999| 日韩一级片网址| 黄色一区三区| 一区二区三区精品在线| 91久久久亚洲精品| 午夜电影亚洲| 亚洲一区二区免费看| 久久aⅴ国产紧身牛仔裤| 9国产精品视频| 欧美在线观看一区二区三区| 日韩亚洲在线| 老鸭窝毛片一区二区三区| 亚洲综合激情| 欧美国产日本| 久久一二三国产| 欧美日韩亚洲一区二区三区在线观看| 欧美在线综合| 欧美日韩综合| 亚洲国产日本| 国内一区二区在线视频观看 | 美国十次了思思久久精品导航| 欧美日本亚洲韩国国产| 亚洲精选在线| 国产午夜精品福利| 久久久亚洲影院你懂的| 欧美日韩午夜激情| 欧美激情一区二区在线| 国产亚洲一区精品| 亚洲无吗在线| 亚洲另类在线一区| 久久先锋资源| 久久久五月婷婷| 国产精品视频一区二区三区| 亚洲精品在线观看免费| 亚洲精品小视频在线观看| 久久国产加勒比精品无码| 欧美综合77777色婷婷| 欧美特黄视频| 亚洲美女在线观看| 在线一区二区三区做爰视频网站| 欧美成年人网| 亚洲欧洲精品成人久久奇米网 | 宅男噜噜噜66国产日韩在线观看| 免费观看成人网| 久久久久久久综合| 国产亚洲精品福利| 久久精品国产一区二区三区免费看 | 欧美在线高清| 欧美伊人久久久久久久久影院| 欧美日韩亚洲在线| 亚洲视频在线观看一区| 亚洲男人av电影| 国产精品入口福利| 午夜精品久久久久影视| 欧美在线一二三区| 狠狠色狠狠色综合日日小说| 欧美一区2区视频在线观看| 久久亚洲影院| 亚洲国内高清视频| 欧美国产一区二区| 日韩视频永久免费| 性感少妇一区| 亚洲福利视频一区| 欧美日韩免费看| 亚洲毛片在线| 久久国产精品亚洲va麻豆| 在线观看成人网| 欧美日韩亚洲一区三区| 午夜视频一区二区| 欧美激情亚洲激情| 国产精品99久久99久久久二8| 国产精品每日更新| 久久亚洲一区| 国产精品99久久久久久人| 亚洲欧美日韩一区二区在线 | 正在播放亚洲一区| 国产区欧美区日韩区| 欧美波霸影院| 亚洲私人影吧| 蜜臀av性久久久久蜜臀aⅴ| 亚洲精品四区| 国内精品嫩模av私拍在线观看| 欧美大胆人体视频| 夜夜爽99久久国产综合精品女不卡| 亚洲精品日韩久久| 91久久精品日日躁夜夜躁国产| 久久精品亚洲热| 亚洲六月丁香色婷婷综合久久| 国产精品v片在线观看不卡| 久久成人精品电影| 99成人免费视频| 麻豆成人av| 久久er99精品| 99re这里只有精品6| 在线免费观看一区二区三区| 欧美视频网址| 欧美成人免费全部| 久久九九有精品国产23|