对于数字电路仿真,我想实现三种状态。即C++中的高、低和未定义。
我看到了Boost::tribool,他们使用enum实现了它
现在为了保存一些内存,我使用1 Byte实现了它。
#ifdef _WINDOWS
typedef __int8 State;
#elif
typedef int8_t State;
#endif
const State kLow = 0;
const State kHigh = 1;
const State kUndefined = 2;发布于 2011-12-29 23:57:13
我肯定会推荐使用枚举。由于这是2011年12月,我可以想象您的编译器支持枚举上的显式底层类型(GCC从4.4开始支持它,VisualC++现在在11.0中支持它)。顺便提一句,<cstdint>现在被visual c++所支持(从10.0开始)。
作为传统c样式枚举的加号:
enum state : std::int8_t {
S_UNKNWON,
S_HIGH,
S_LOW
};或在枚举的内存中添加作用域(避免污染全局范围):
enum class state : std::int8_t {
unknown,
high,
low
};
state status = state::unknown;当然,在查看了boost::tribool之后,我建议您在任何情况下都这样做--除非您确实需要确保state恰好是1字节。
发布于 2011-12-29 23:55:50
没有意外转换的主要原因(类型安全是正确使用C++的关键之一)。
enum Tri { Yes, No, Maybe };
int main()
{
Tri y = Yes;
y= 1; // Fails to compile.
}其次,您正在使用三个字节来保存这里的不同状态。
const State kLow = 0;
const State kHigh = 1;
const State kUndefined = 2;如果使用枚举,就不会占用空间(尽管可能会对上面的内容进行优化)。
C++11还允许您指定枚举的大小:
enum class Tri : char { Yes, No, Maybe };
// ^^^^ Uses a char sized object你觉得这有什么潜在的问题吗?
是。非类型安全
为什么一个人只浪费4个字节而不是3个值的一个字节?
好呀。在任何现代个人电脑里这真的很重要吗。
可能是嵌入式系统(但您显然是在使用WINDOWS)。
你还有更好的办法吗?
是。在C++11中使用枚举
https://codereview.stackexchange.com/questions/7262
复制相似问题