c++ - 一个包含 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;
};
我的问题:
关于这种情况,哪种实现更好?
当它们都不是那么理想时,您会想出哪种方法?
这个问题的原因:这是一个Record
for char*
。所以在这种情况下char* value
,一个unsigned int length
有道理的。我想切换到一种int
情况并遇到这个问题。
解决方案
从某种意义上说,模板是最佳的,它始终与基础类型的大小相同,并且会被优化掉。一些小改动。
template <class T>
class Record {
T value;
public:
const T& getValue() const { return value; }
}
但是,此解决方案不允许您拥有具有不同模板参数的 Records 容器,并且使序列化/反序列化代码更难使用。
此外,如果这段代码对你有用,那么问问自己这个“记录”的目的是什么?我只会使用底层类型本身。
推荐阅读
- google-play - Google Play 商店内部测试 - 应用卡在启动画面
- tensorflow - ValueError: None 仅在第一维中受支持。张量“input_tensor”的形状无效“[1, None, None, 3]”
- angularjs - AngularJS 1.8.1 组件未在 Internet Explorer 中加载
- php - 使用 .htaccess 更改我的 php 站点的 URL
- c# - Google Cloud Pub Sub StreamingPull 无法正常工作
- xamarin - 如何优化 xamarin android 应用程序大小?
- apache-spark - Spark --jars 选项添加的 jar 不起作用
- r - 如何在 RStudio 中为 R 包构建 API 文档?
- c# - 工人服务神秘地停止工作
- java - 向实体添加@Cachable 无效