我想提出一个 Record
类,其中包含一个 int
但它可能是一个 int64_t
、int32_t
, int16_t
, int8_t
.
但是我遇到了问题,当我想从此 Record
对象中读取数据时。
我们的假设:
我们知道要保存哪个 int
。
我们必须注意 getValue()
此类函数的性能 以及此类或 union 的大小。
我会在上下文中尝试 3 种实现(非常愚蠢)。
1.第一次实现:
class Record{
int64_t value;
unsigned int bytes; // number of bytes, in context 1 or 2 or 3 or 4 representing int8_t, int16_t, int32_t, int64_t
int64_t getValue() { return value; }
unsigned int getNumByte() { return bytes; }
}
我会尝试调用 getValue()
和 getNumByte()
然后将值转换为正确的类型,例如 if (getNumByte() == 1) 自动值 = (int8_t getValue())
。
2.第二:使用模板
。
template <class T>
class Record{
T value;
T getValue() { return value; }
}
3.第三种:使用union
:
union Record {
int64_t int64;
int32_t int32;
int16_t int16;
int8_t int8;
};
我的问题:
关于这个上下文,哪个实现更好?
当它们都不是那么理想时,您会想出哪种方法?
这个问题的原因:它是char*
的Record
。所以在这种情况下,char* value
和 unsigned int length
是有意义的。我想切换到 int
情况并遇到这个问题。
最佳答案
模板是最佳的,因为它总是与底层类型大小相同,并且会被优化掉。一些小的变化。
template <class T>
class Record {
T value;
public:
const T& getValue() const { return value; }
}
但是,此解决方案不允许您拥有一个包含具有不同模板参数的 Records 容器,并且使序列化/反序列化代码更难处理。
此外,如果此代码对您有用,那么问问自己此“记录”的用途是什么?我只会使用底层类型本身。
关于c++ - 在不同的字节中包含 int 的类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54024379/