我正在开发一个简单的处理器仿真器,我的一个规范说所有寄存器都必须是子字节可访问的字节(它是一个32位处理器,所以有4个字节的寄存器用于每个正常的寄存器)。当我需要访问寄存器时,我需要一些方法来确定我是否会根据其ID获取uchar,ushort,uint或float。我提前知道哪个寄存器指向哪种类型,但是我不知道存储允许我的寄存器指针,忽略返回类型,用这些值执行任意算术。我想也许C ++ 11可以帮助我在这里,但我不知道在哪里看。
我已经考虑过在switch语句中对指针进行类型转换,但是我必须在函数中重做那个switch语句实际要求的值,因为函数不能改变返回类型mid -execution。
我考虑使用模板化对象来指出寄存器,但是我不能在同一个数组中存储具有不同模板参数的模板化对象(或者我可以吗?)
答案 0 :(得分:0)
事实证明,没有简单的方法可以解决这个问题。但是,我能够将数组元素的类型存储在并行的整数数组中。我会询问类型,并使用switch语句转换为必要的类型并执行计算。来源可以在GitHub找到。
答案 1 :(得分:0)
通常union
是......很棘手,你应该避免它们。但是在CPU仿真器的情况下,我认为,由于寄存器正在设计为unions
,这可能是您可以/应该使用它们的极少数情况之一。
unions
打开了很多类型 - 不安全的大门。但是,由于您的CPU也只是以非类型安全的方式执行寄存器上的指令(可能),只需将寄存器设为联合。它们完全不是C ++ 11,而是纯C(C ++ 11中只有微小的补充)。
union Register {
uint32_t val;
struct {
uint16_t lo;
uint16_t hi;
} u16;
struct {
uint8_t b0;
uint8_t b1;
uint8_t b2;
uint8_t b3;
} u8;
};
或类似。
当然你可以实现一个类型检查CPU,或者只执行类型安全代码的模拟器,但我想这超出了你的任务范围。