C++ 迭代结构时遇到的问题

C++ 迭代结构时遇到的问题,c++,oop,C++,Oop,我有一个名为DescriptorByte的位域结构,与1字节对齐,还有一个用于保存大量描述符byte的结构,如下所示: struct DescriptorByte { unsigned char IsImmedCalc : 1; unsigned char IsPrefix : 1; unsigned char NoMemOp : 1; unsigned char Size : 5; }; struct OpcodeList { DescriptorBy

我有一个名为DescriptorByte的位域结构,与1字节对齐,还有一个用于保存大量描述符byte的结构,如下所示:

struct DescriptorByte
{
    unsigned char IsImmedCalc : 1;
    unsigned char IsPrefix : 1;
    unsigned char NoMemOp : 1;
    unsigned char Size : 5;
};

struct OpcodeList
{
    DescriptorByte ADD_EB_GB;
    DescriptorByte ADD_EV_GV;
    DescriptorByte ADD_GB_EB;
    DescriptorByte ADD_GV_EV;
    DescriptorByte ADD_8_OI =   { TRUE, FALSE, TRUE, OPBASE + IMMED_8 };
    DescriptorByte ADD_32_OI =  { TRUE, FALSE, TRUE, OPBASE + IMMED_32 };
    DescriptorByte PUSH_ES =    { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte POP_ES =     { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte OR_EB_GB;
        //ETC
};
OpcodeList opcodelist;
BYTE count = 5;
DescriptorByte = opcodelist + count;
typedef std::array<DescriptorByte, 9> OpcodeList;

enum OpcodeIndex
{
    ADD_EB_GB = 0,
    ADD_EV_GV,
    ADD_GB_EB,
    ADD_GV_EV,
    ADD_8_OI,
    ADD_32_OI,
    PUSH_ES,
    POP_ES,
    OR_EB_GB
}
我想做的是基于一个数字(字节)遍历结构,如下所示:

struct DescriptorByte
{
    unsigned char IsImmedCalc : 1;
    unsigned char IsPrefix : 1;
    unsigned char NoMemOp : 1;
    unsigned char Size : 5;
};

struct OpcodeList
{
    DescriptorByte ADD_EB_GB;
    DescriptorByte ADD_EV_GV;
    DescriptorByte ADD_GB_EB;
    DescriptorByte ADD_GV_EV;
    DescriptorByte ADD_8_OI =   { TRUE, FALSE, TRUE, OPBASE + IMMED_8 };
    DescriptorByte ADD_32_OI =  { TRUE, FALSE, TRUE, OPBASE + IMMED_32 };
    DescriptorByte PUSH_ES =    { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte POP_ES =     { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte OR_EB_GB;
        //ETC
};
OpcodeList opcodelist;
BYTE count = 5;
DescriptorByte = opcodelist + count;
typedef std::array<DescriptorByte, 9> OpcodeList;

enum OpcodeIndex
{
    ADD_EB_GB = 0,
    ADD_EV_GV,
    ADD_GB_EB,
    ADD_GV_EV,
    ADD_8_OI,
    ADD_32_OI,
    PUSH_ES,
    POP_ES,
    OR_EB_GB
}

由于BiFieldStices被对齐到1字节,所以我应该得到OpCODLIST表的第五个元素,但是我不知道如何在C++上实现这一点,我只知道如何在ASM://P>中实现它。

LEA EAX, OPCODELIST
MOV ECX, COUNT
MOV EAX, DWORD PTR [EAX+ECX];
AND EAX, 0FF;

谢谢。

您尝试通过多种方式访问此“列表”:按名称(如
添加\u EB\u GB
)和按索引。你不能用结构来做这件事

我建议使用
std::vector
(或
std::array
)。这样您就可以通过索引进行访问。如果您仍然需要按名称访问,请将您的名称设置为该向量的常量索引

有点像这样:

struct DescriptorByte
{
    unsigned char IsImmedCalc : 1;
    unsigned char IsPrefix : 1;
    unsigned char NoMemOp : 1;
    unsigned char Size : 5;
};

struct OpcodeList
{
    DescriptorByte ADD_EB_GB;
    DescriptorByte ADD_EV_GV;
    DescriptorByte ADD_GB_EB;
    DescriptorByte ADD_GV_EV;
    DescriptorByte ADD_8_OI =   { TRUE, FALSE, TRUE, OPBASE + IMMED_8 };
    DescriptorByte ADD_32_OI =  { TRUE, FALSE, TRUE, OPBASE + IMMED_32 };
    DescriptorByte PUSH_ES =    { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte POP_ES =     { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte OR_EB_GB;
        //ETC
};
OpcodeList opcodelist;
BYTE count = 5;
DescriptorByte = opcodelist + count;
typedef std::array<DescriptorByte, 9> OpcodeList;

enum OpcodeIndex
{
    ADD_EB_GB = 0,
    ADD_EV_GV,
    ADD_GB_EB,
    ADD_GV_EV,
    ADD_8_OI,
    ADD_32_OI,
    PUSH_ES,
    POP_ES,
    OR_EB_GB
}
请注意性能。在机器代码级别,结构和静态大小的数组将执行完全相同的操作。它们是ptr+偏移字段。这正是
std::array
将编译成的内容
std::vector
会有更多的开销,因为它支持不同的大小,所以只有当您有大小不同的
OpcodeList
对象时才使用它


关于初始化,这确实比您拥有的更为冗长/丑陋,但为了使事情易于管理,这是一项值得努力的工作。

您尝试通过多种方式访问此“列表”:按名称(如
ADD\u EB\u GB
)和按索引。你不能用结构来做这件事

我建议使用
std::vector
(或
std::array
)。这样您就可以通过索引进行访问。如果您仍然需要按名称访问,请将您的名称设置为该向量的常量索引

有点像这样:

struct DescriptorByte
{
    unsigned char IsImmedCalc : 1;
    unsigned char IsPrefix : 1;
    unsigned char NoMemOp : 1;
    unsigned char Size : 5;
};

struct OpcodeList
{
    DescriptorByte ADD_EB_GB;
    DescriptorByte ADD_EV_GV;
    DescriptorByte ADD_GB_EB;
    DescriptorByte ADD_GV_EV;
    DescriptorByte ADD_8_OI =   { TRUE, FALSE, TRUE, OPBASE + IMMED_8 };
    DescriptorByte ADD_32_OI =  { TRUE, FALSE, TRUE, OPBASE + IMMED_32 };
    DescriptorByte PUSH_ES =    { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte POP_ES =     { TRUE, FALSE, TRUE, OPBASE };
    DescriptorByte OR_EB_GB;
        //ETC
};
OpcodeList opcodelist;
BYTE count = 5;
DescriptorByte = opcodelist + count;
typedef std::array<DescriptorByte, 9> OpcodeList;

enum OpcodeIndex
{
    ADD_EB_GB = 0,
    ADD_EV_GV,
    ADD_GB_EB,
    ADD_GV_EV,
    ADD_8_OI,
    ADD_32_OI,
    PUSH_ES,
    POP_ES,
    OR_EB_GB
}
请注意性能。在机器代码级别,结构和静态大小的数组将执行完全相同的操作。它们是ptr+偏移字段。这正是
std::array
将编译成的内容
std::vector
会有更多的开销,因为它支持不同的大小,所以只有当您有大小不同的
OpcodeList
对象时才使用它


关于初始化,这确实比您拥有的更为冗长/丑陋,但为了使事情易于管理,这是一项值得努力的工作。

您也可以使用
结构来实现这一点:

OpcodeList opcodelist;
BYTE count = 5;
void* p1 = &opcodelist;
DescriptorByte* p2 = (DescriptorByte*)p1;
DescriptorByte = *(p2 + count);

也可以使用
结构执行此操作:

OpcodeList opcodelist;
BYTE count = 5;
void* p1 = &opcodelist;
DescriptorByte* p2 = (DescriptorByte*)p1;
DescriptorByte = *(p2 + count);

我担心性能,intel x86和x64上有超过510个操作码的空间,所以我希望我可以使用一些指针和置换。将成员添加到向量中怎么样:DescriptorByte ADD_8_OI={TRUE,FALSE,TRUE,OPBASE+IMMED_8};等等,我需要为列表中的每一个使用vector.assing吗/感谢您的帮助:)我担心性能,intel x86和x64上有510多个操作码的空间,因此我希望可以使用一些指针和置换。将成员添加到向量中怎么样:DescriptorByte ADD_8_OI={TRUE,FALSE,TRUE,OPBASE+IMMED_8};等等,我需要为列表中的每一个使用vector.assing吗/谢谢你的帮助:)