使用移位的无符号数字作为数组的索引号是一种很好的做法



通过以下方式将枚举定义为标志

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项中提出了这一点。

但是,使用位移定义枚举值看起来很不稳定。 你不会得到一个连续的数组。这对你很重要 - 避免这种情况。

相关内容

  • 没有找到相关文章

最新更新