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

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

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

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

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

    然后是他們產生的二進制程序集(鏈接前)的內容,以及虛擬機在執(zhí)行完所有代碼之后所產生的數據結構和那兩個二進制程序集在鏈接后的內容:

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:虛擬機
  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 

    如果仔細觀察的話你會發(fā)現我暫時還沒有對中間的數據結構進行優(yōu)化,導致有時候會產生重復的信息。不過優(yōu)化也是遲早的事情,現在先做功能,太早優(yōu)化是魔鬼也。

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

評論:
# re: Vczh Library++ 3.0實現泛型全局存儲 2010-07-20 06:53 | 全圖靈死程
- -!!   回復  更多評論
  
# re: Vczh Library++ 3.0實現泛型全局存儲 2010-08-08 23:19 | 文殊廣法
太深奧,看不懂。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久久福利视频| 欧美大学生性色视频| 欧美国产91| 日韩午夜电影av| 海角社区69精品视频| 欧美日本韩国一区| 久久综合九色99| 久久精品视频免费观看| av不卡在线| 亚洲国内高清视频| 久久一区免费| 久久精品国产亚洲一区二区三区| 亚洲理论在线观看| 日韩一区二区精品| 日韩午夜激情| 亚洲综合国产激情另类一区| 在线视频一区观看| 亚洲视频999| 小嫩嫩精品导航| 性一交一乱一区二区洋洋av| 午夜一区二区三区在线观看| 亚洲免费在线电影| 欧美一区二区三区精品 | 午夜亚洲激情| 久久精品99无色码中文字幕| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久久五月婷婷| 欧美精品免费看| 国产欧美一区二区三区久久人妖| 韩日成人在线| 亚洲免费在线观看| 蜜桃精品久久久久久久免费影院| 欧美国产精品专区| 亚洲美女免费精品视频在线观看| 西西人体一区二区| 亚洲国产精品免费| 久久精品99无色码中文字幕| 欧美成人精品在线播放| 黄色成人免费观看| 亚洲一区二区不卡免费| 亚洲国产精品日韩| 免费视频最近日韩| 亚洲成人在线观看视频| 中文av一区二区| 久久亚洲欧美| 另类成人小视频在线| 一区二区三区在线高清| 久久久噜噜噜久久| 亚洲丝袜av一区| 欧美色精品在线视频| 亚洲在线视频免费观看| 亚洲精品欧美在线| 欧美视频不卡| 欧美在线播放一区| 久久成人18免费观看| 一区二区亚洲欧洲国产日韩| 久久精品一区二区三区不卡| 香蕉久久夜色精品国产使用方法| 国产精品日韩| 另类av一区二区| 美女精品一区| 亚洲女同性videos| 久久影院午夜片一区| 亚洲免费精彩视频| 午夜精品久久久久久久| 亚洲国产精品免费| 日韩亚洲精品在线| 国产日本欧美一区二区三区| 午夜精品一区二区三区电影天堂| 亚洲狠狠丁香婷婷综合久久久| 欧美理论电影在线观看| 久久久免费av| 欧美成人久久| 欧美影视一区| 欧美性猛片xxxx免费看久爱 | 久色婷婷小香蕉久久| 亚洲精品小视频| 久久综合给合久久狠狠色| 亚洲男女自偷自拍图片另类| 久久综合影音| 另类激情亚洲| 国产一区二区三区日韩欧美| 亚洲深夜福利视频| 在线视频亚洲| 欧美体内she精视频在线观看| 欧美激情一区二区三区蜜桃视频 | 久久国产欧美| 久久福利电影| 尤物yw午夜国产精品视频| 亚洲一区精品电影| 亚洲天堂成人在线视频| 欧美三级午夜理伦三级中视频| 亚洲三级网站| 亚洲欧美综合另类中字| 国产精品女人毛片| 久久精品视频在线看| 可以免费看不卡的av网站| 亚洲国产精品久久人人爱蜜臀| 欧美超级免费视 在线| 亚洲国产精品va| 欧美理论视频| 欧美一区91| 亚洲最新合集| 美脚丝袜一区二区三区在线观看| 亚洲第一久久影院| 国产精品每日更新| 久久久精品国产一区二区三区| 亚洲人成在线观看一区二区| 欧美一区二区日韩一区二区| 在线观看日韩av先锋影音电影院 | 亚洲第一在线视频| 欧美日韩综合久久| 亚洲欧美日韩专区| 亚洲国产精品日韩| 欧美亚洲免费高清在线观看| 国产精品色午夜在线观看| 久久精品人人做人人综合| 99精品欧美一区二区三区| 国内精品久久久| 欧美视频一区二区| 亚洲一区在线视频| 亚洲午夜精品| 日韩图片一区| 亚洲韩国青草视频| 久久国产精品99久久久久久老狼 | 日韩视频精品在线| 亚洲国产精品一区在线观看不卡 | 欧美激情精品久久久久久黑人 | 亚洲午夜视频在线观看| 亚洲私人影院在线观看| 久久久综合精品| 国产一区二区剧情av在线| 欧美精品一区二区三区蜜桃 | 亚洲综合电影| 欧美激情亚洲另类| 国产精品网站在线播放| 欧美韩日精品| 国产精品久久久久高潮| 亚洲欧美日本精品| 美女任你摸久久| 国产三级精品三级| 久久青青草综合| 久久久久久欧美| 欧美视频网站| 欧美成人午夜77777| 亚洲精品女人| 久久精品视频在线看| 亚洲国产精品小视频| 亚洲欧美日韩精品| 欧美国产精品人人做人人爱| 久久婷婷国产综合尤物精品| 亚洲视频一二三| 欧美精品少妇一区二区三区| 日韩亚洲在线| 久久精品视频导航| 亚洲精品欧美一区二区三区| 欧美一区二区三区电影在线观看| 亚洲国产精品久久久久秋霞不卡 | 亚洲一区二区三区视频播放| 欧美激情精品久久久久久蜜臀 | 国产情人节一区| 一区二区三区视频在线观看| 日韩一区二区免费高清| 欧美国产视频日韩| 一本大道久久a久久精二百| 午夜精品偷拍| 亚洲美女91| 99精品欧美一区二区三区综合在线| 欧美v日韩v国产v| 亚洲一区二区三区国产| 一区二区视频免费完整版观看| 国产色产综合产在线视频| 欧美国产精品va在线观看| 国产精品久久久久久久久婷婷 | 亚洲精品美女免费| 欧美区在线播放| 能在线观看的日韩av| 午夜在线精品| 亚洲国产精品久久人人爱蜜臀| 在线中文字幕一区| 国产精品igao视频网网址不卡日韩| 欧美成人蜜桃| 欧美一级网站| 久久久久国产成人精品亚洲午夜| 欧美成人精品激情在线观看| 亚洲精品自在在线观看| 国产精品盗摄一区二区三区| 欧美视频四区| 国产精品免费看片| 亚洲人成小说网站色在线| 久久www成人_看片免费不卡| 一本色道久久综合狠狠躁的推荐| 亚洲在线一区二区| 亚洲欧美在线观看| 美女国产一区| 亚洲一级在线观看| 日韩一级在线观看| 国产一区二区0| 99这里只有精品| 看片网站欧美日韩|