首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用int8_t实现Tribool

用int8_t实现Tribool
EN

Code Review用户
提问于 2011-12-29 10:45:41
回答 2查看 893关注 0票数 5

对于数字电路仿真,我想实现三种状态。即C++中的高、低和未定义。

我看到了Boost::tribool,他们使用enum实现了它

现在为了保存一些内存,我使用1 Byte实现了它。

代码语言:javascript
复制
#ifdef _WINDOWS
typedef __int8 State;
#elif
typedef int8_t State;
#endif

const State kLow = 0;
const State kHigh = 1;
const State kUndefined = 2;
  1. 你觉得这有什么潜在的问题吗?
  2. 为什么一个人只浪费4个字节而不是3个值的一个字节?
  3. 你还有更好的办法吗?
EN

回答 2

Code Review用户

回答已采纳

发布于 2011-12-29 23:57:13

我肯定会推荐使用枚举。由于这是2011年12月,我可以想象您的编译器支持枚举上的显式底层类型(GCC从4.4开始支持它,VisualC++现在在11.0中支持它)。顺便提一句,<cstdint>现在被visual c++所支持(从10.0开始)。

作为传统c样式枚举的加号:

代码语言:javascript
复制
enum state : std::int8_t {
    S_UNKNWON,
    S_HIGH,
    S_LOW
};

或在枚举的内存中添加作用域(避免污染全局范围):

代码语言:javascript
复制
enum class state : std::int8_t {
    unknown,
    high,
    low
};

state status = state::unknown;

当然,在查看了boost::tribool之后,我建议您在任何情况下都这样做--除非您确实需要确保state恰好是1字节。

票数 5
EN

Code Review用户

发布于 2011-12-29 23:55:50

没有意外转换的主要原因(类型安全是正确使用C++的关键之一)。

代码语言:javascript
复制
enum Tri { Yes, No, Maybe };

int main()
{
    Tri     y   = Yes;
    y= 1;   // Fails to compile.
}

其次,您正在使用三个字节来保存这里的不同状态。

代码语言:javascript
复制
const State kLow = 0;
const State kHigh = 1;
const State kUndefined = 2;

如果使用枚举,就不会占用空间(尽管可能会对上面的内容进行优化)。

C++11还允许您指定枚举的大小:

代码语言:javascript
复制
enum class Tri : char { Yes, No, Maybe };
//               ^^^^  Uses a char sized object

你觉得这有什么潜在的问题吗?

是。非类型安全

为什么一个人只浪费4个字节而不是3个值的一个字节?

好呀。在任何现代个人电脑里这真的很重要吗。

可能是嵌入式系统(但您显然是在使用WINDOWS)。

你还有更好的办法吗?

是。在C++11中使用枚举

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/7262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档