構造体のほうは境界調整(アラインメント)のためです。
たとえば4バイトのデータを読み書きするときにはメモリアドレスが4の倍数のほうが高速に読み書きできます。
それどころか,x86以外のCPUでは境界調整がなっていないとエラーになってしまうものもあります。
そのためバイト数が違うデータ型同士を1つの構造体やクラスに置くと,正しく境界調整するようにわざと「隙間」を置きます。
そのため見た目よりバイト数が多くなると言うことになるのです。
ヘルプでTypeを引けばわかりますが,境界調整する単位はAlignを修飾させれば好きに変更できます。
Align(1)なら1バイト単位に揃える,即ち境界調整しないということになります。
コード:
#strict
#prompt
Type Align(1) A
c as Char
w as Word
End Type
Print SizeOf (A)
これならAのサイズは3バイトになります。
LANG_USER_DEFAULTのほうは確かにないですね。
私としてはConst LANG_USER_DEFAULT = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)のほうがよいと思いますが。
(MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)はコンパイルが通ることから全て定義されているようです)