回答編集履歴

2

回答を追記

2016/10/23 07:51

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -114,6 +114,188 @@
114
114
 
115
115
 
116
116
 
117
+ # 追記
118
+
119
+
120
+
121
+ 定数とS.I.それぞれのクラスファイルについて、
122
+
123
+ `System.out.println(JUGEMU);`が5行のときと10行のときに"javap -v"した結果の差分を見ると、
124
+
125
+ 以下のようになりました。
126
+
127
+
128
+
129
+ ■定数
130
+
131
+ ```
132
+
133
+ < Last modified 2016/10/23; size 1022 bytes
134
+
135
+ < MD5 checksum 31799146ce54620a0fa358c75934c51a
136
+
137
+ ---
138
+
139
+ > Last modified 2016/10/23; size 1082 bytes
140
+
141
+ > MD5 checksum e0210a800e994184e19cdda5fffb2dd1
142
+
143
+ 80c80,95
144
+
145
+ < 40: return
146
+
147
+ ---
148
+
149
+ > 40: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
150
+
151
+ > 43: ldc #8 // String ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
152
+
153
+ > 45: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
154
+
155
+ > 48: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
156
+
157
+ > 51: ldc #8 // String ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
158
+
159
+ > 53: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
160
+
161
+ > 56: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
162
+
163
+ > 59: ldc #8 // String ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
164
+
165
+ > 61: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
166
+
167
+ > 64: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
168
+
169
+ > 67: ldc #8 // String ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
170
+
171
+ > 69: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
172
+
173
+ > 72: getstatic #21 // Field java/lang/System.out:Ljava/io/PrintStream;
174
+
175
+ > 75: ldc #8 // String ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
176
+
177
+ > 77: invokevirtual #27 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
178
+
179
+ > 80: return
180
+
181
+ 87a103,107
182
+
183
+ > line 12: 48
184
+
185
+ > line 13: 56
186
+
187
+ > line 14: 64
188
+
189
+ > line 15: 72
190
+
191
+ > line 16: 80
192
+
193
+ 90c110
194
+
195
+ < 0 41 0 args [Ljava/lang/String;
196
+
197
+ ---
198
+
199
+ > 0 81 0 args [Ljava/lang/String;
200
+
201
+ ```
202
+
203
+ ■S.I.
204
+
205
+ ```
206
+
207
+ < Last modified 2016/10/23; size 1080 bytes
208
+
209
+ < MD5 checksum c3f1c460efa26e7659fba52364f59722
210
+
211
+ ---
212
+
213
+ > Last modified 2016/10/23; size 1145 bytes
214
+
215
+ > MD5 checksum 81b04a322bcb9ff572487284407addf3
216
+
217
+ 95c95,110
218
+
219
+ < 45: return
220
+
221
+ ---
222
+
223
+ > 45: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
224
+
225
+ > 48: getstatic #12 // Field JUGEMU:Ljava/lang/String;
226
+
227
+ > 51: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
228
+
229
+ > 54: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
230
+
231
+ > 57: getstatic #12 // Field JUGEMU:Ljava/lang/String;
232
+
233
+ > 60: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
234
+
235
+ > 63: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
236
+
237
+ > 66: getstatic #12 // Field JUGEMU:Ljava/lang/String;
238
+
239
+ > 69: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
240
+
241
+ > 72: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
242
+
243
+ > 75: getstatic #12 // Field JUGEMU:Ljava/lang/String;
244
+
245
+ > 78: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
246
+
247
+ > 81: getstatic #23 // Field java/lang/System.out:Ljava/io/PrintStream;
248
+
249
+ > 84: getstatic #12 // Field JUGEMU:Ljava/lang/String;
250
+
251
+ > 87: invokevirtual #29 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
252
+
253
+ > 90: return
254
+
255
+ 102a118,122
256
+
257
+ > line 16: 54
258
+
259
+ > line 17: 63
260
+
261
+ > line 18: 72
262
+
263
+ > line 19: 81
264
+
265
+ > line 20: 90
266
+
267
+ 105c125
268
+
269
+ < 0 46 0 args [Ljava/lang/String;
270
+
271
+ ---
272
+
273
+ > 0 91 0 args [Ljava/lang/String;
274
+
275
+ ```
276
+
277
+ 有意な違いは、
278
+
279
+ 「"定数"バージョンのクラスファイルでは定数`JUGEMU`にアクセスする際の命令が ldc であるのに対して、
280
+
281
+ "S.I."バージョンでは getstatic であること」
282
+
283
+ だけです。
284
+
285
+
286
+
287
+ この結果から、
288
+
289
+ - 定数を、それを定義したクラスの内部で使用する際はインライン展開されない
290
+
291
+ - 命令 getstatic は、ldc より1バイト大きい
292
+
293
+
294
+
295
+ ということが予想できます。
296
+
297
+
298
+
117
299
  ---
118
300
 
119
301
  ちなみに、私の個人的な意見としては、

1

回答を追記

2016/10/23 07:51

投稿

KiyoshiMotoki
KiyoshiMotoki

スコア4791

test CHANGED
@@ -106,6 +106,14 @@
106
106
 
107
107
 
108
108
 
109
+ ※検証した環境は
110
+
111
+ OS : Mac OS X 10.9
112
+
113
+ JDK : 1.7.0
114
+
115
+
116
+
109
117
  ---
110
118
 
111
119
  ちなみに、私の個人的な意見としては、