初始化联合内部的结构(C ++)

时间:2011-10-21 18:23:47

标签: c++ x86

我正在C ++(Visual Studio 2010)中创建一个非常有限的,特定于域的x86汇编程序,它在运行时动态生成指令,将其写入内存并执行它。首先,我将它们写入临时字节流,然后将整个流写入一个memcpy中的可执行内存。

我使用以下代码构建movsd [imm32], xmm1指令:

typedef unsigned char byte;
enum SSE2Register;

void WriteValueToMemory(double* dest, SSE2Register source)
{
    union
    {
        struct
        {
            byte insts[4];
            double* dest;
        };

        byte bytes[8];
    } movsd = 
    {
        // movsd [imm32], xmm1
        0xF2, 0x0F, 0x11, // Opcode
        0x05 + (8 * source), // ModR/M 
        dest // imm32
    };

    _stream.Write(movsd.bytes, sizeof(movsd.bytes));
}

此代码有效:三个操作码字节和ModR / M字节写入insts,目标(imm32)写入destbytes包含原始字节的整个指令,准备写入指令流。

但是,我很好奇这种初始化联合的方法是否安全/可移植。可以在一组括号中初始化insts的四个值和dest的值吗?

换句话说,这是正确,可移植的这样做的方式,还是应该以不同的方式进行?

谢谢!

1 个答案:

答案 0 :(得分:2)

http://msdn.microsoft.com/en-us/library/z2cx9y4f.aspx

  

匿名结构

     

Microsoft C扩展允许您声明结构变量   在另一个结构中没有给它起名字。这些嵌套   结构称为匿名结构。 C ++不允许   匿名结构。

     

您可以访问匿名结构的成员,就像它们一样   包含结构中的成员。

但是,您正在做的事情不需要union

void WriteValueToMemory(double* dest, SSE2Register source)
{
    struct
    {
        byte insts[4];
        double* dest;
    } movsd = 
    {  // movsd [imm32], xmm1
        0xF2, 0x0F, 0x11, // Opcode
        0x05 + (8 * source), // ModR/M 
        dest // imm32
    };

    _stream.Write(&movsd, sizeof(movsd));
}