Dをつつく18ー共用体。皆で仲良くルームシェア。
例えば、共用体にuintとushortのフィールドがあって、uintに0xAAAABBBBの値を代入したら、共用されているからushortのフィールドの値はBBBBになるんだ。
早速実験してみよう。
import std.stdio;
union Register {
public:
ushort AX;
uint EAX;
}
int main( char[][] ) {
Register reg;
writeln( "共用体のサイズ", reg.sizeof );
reg.EAX = 0x_AAAA;
writef( "EAX=%x", reg.EAX, "\n" );
writeln( "AX=", reg.AX );
return 0;
}
このサンプルプログラムを実行してみよう。EAXフィールドの値が0xAAAAならば、AXフィールドの値も0xAAAAになるはずピヨッ。あれ?0が出たぞ?どうなっているんだ・・・
静的初期化じゃなければだめなのかなぁ?
import std.stdio;
union Register {
public:
ushort AX;
uint EAX;
}
int main( char[][] ) {
Register reg;
writeln( "共用体のサイズ", reg.sizeof );
reg.EAX = 0x_AAAA;
writef( "EAX=%x", reg.EAX, "\n" );
writeln( "AX=", reg.AX );
reg.AX = 5;
writef( "EAX=%x", reg.EAX, "\n" );
writeln( "AX=", reg.AX );
//静的初期化
static Register reg1 = { EAX:0x0000AAAA };
writef( "EAX=%x", reg1.EAX, "\n" );
writeln( "AX=", reg1.AX );
return 0;
}
あれぇ・・・やっぱり駄目だ。共有されていない。しかも構造体と同じ動きをするぞ・・・
もうこれはdmd2.014のバグとしか思えないピヨ。
この現象の解決法を知っている人はコメントで教えて下さい。