通过以下方式将枚举定义为标志
typedef enum
{
NOT_PID = 0,
PID1 = (1U << 0),
PID2 = (1U << 1),
NUM_PID = 3
} pid_t;
float m_derivative[pid_t::NUM_PID];
并按如下方式使用它:
m_derivative[pid_t::PID1] = 4.0
m_derivative[pid_t::PID2] = 3.0
以这种方式使用移位的无符号数字作为数组的索引号是否很好?
如果你再走下去会怎样?
typedef enum
{
NOT_PID = 0,
PID1 = (1U << 0),
PID2 = (1U << 1),
PID3 = (1U << 2),
NUM_PID = 4
} pid_t;
float m_derivative[pid_t::NUM_PID];
m_derivative[pid_t::PID3] = 4.0; // out of bounds
在这里,PID3 = 4
不少于NUM_PID
.这会导致越界访问。
如果将NUM_PID
定义为足够大,则它不再是顾名思义的 PID 数量。此外,如果您有相对大量的PID,那么您将浪费大量内存。例如,对于 20 个 PID,您需要一个包含 2^20 = 1048576 个元素的数组,假设使用 32 位枚举器,则为 4MB。
如果你真的在某个地方需要两个的力量,只要你需要它们,就生产它们:
enum pid_t { NOT_PID, PID1, PID2, PID3, NUM_PID };
auto pid_bit(pid_t pid) -> unsigned int {
if (pid == NOT_PID) {
return 0;
}
return 1u << (pid-1);
}
另请注意,在C++中,您不需要键入定义枚举。
使用枚举值作为数组索引是一种很好的做法。事实上,斯科特·迈耶斯(Scott Meyers(在"有效的现代C++"的第10项中提出了这一点。
但是,使用位移定义枚举值看起来很不稳定。 你不会得到一个连续的数组。这对你很重要 - 避免这种情况。