通过以下方式将枚举定义为标志
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++中,您无需键入枚举。