c++ - 在不同的字节中包含 int 的类?

标签 c++ int bit unions

我想提出一个 Record 类,其中包含一个 int 但它可能是一个 int64_tint32_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* valueunsigned 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/

相关文章:

c++ - MFC 中是否有一个标准的目录浏览器对话框,不涉及用户创建目录以指定尚不存在的目录?

python - 为什么 int(maxint) 给出的是 long,而 int(int(maxint)) 给出的是 int?这是 NumPy 错误吗?

java - 如何在逗号中添加逗号?

c - 在 C 中使用按位运算符分隔字节中的 Nybbles

c++ - 向上移动对象层次结构

c++ - 是否有任何可用的操作/围栏比发布弱但仍提供同步语义?

c++ - 开罗 - 多线程 - 在 cairo_image_surface_create 期间卡住

c# - 为什么从另一个类访问时static int总是0

对C中数字的值和数字的范围感到困惑

c 位操作操作不乘以字符