首页 > 解决方案 > 一个包含 int 不同字节的类?

问题描述

我想提出一个Record类,其中包含 aint但它可能是 a int64_t, int32_t, int16_t, int8_t
但是当我想从这个Record对象中读取数据时,我遇到了问题。


在我们的上下文中的假设:
我们知道int我们想要保存哪个。
我们必须注意此类功能的性能以及此类或联合的大小getValue()

我会在上下文中尝试 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) auto value = (int8_t getValue()).


2.第二:使用template.

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;
};

我的问题:
关于这种情况,哪种实现更好?
当它们都不是那么理想时,您会想出哪种方法?


这个问题的原因:这是一个Recordfor char*。所以在这种情况下char* value,一个unsigned int length有道理的。我想切换到一种int情况并遇到这个问题。

标签: c++intbitunions

解决方案


从某种意义上说,模板是最佳的,它始终与基础类型的大小相同,并且会被优化掉。一些小改动。

template <class T> 
class Record {
    T value;
  public:
    const T& getValue() const { return value; }
}

但是,此解决方案不允许您拥有具有不同模板参数的 Records 容器,并且使序列化/反序列化代码更难使用。

此外,如果这段代码对你有用,那么问问自己这个“记录”的目的是什么?我只会使用底层类型本身。


推荐阅读