c++ - 将移位的无符号数字用作数组的索引号是一个好习惯

标签 c++ c++11 c++17

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

    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++中,您无需键入枚举。

关于c++ - 将移位的无符号数字用作数组的索引号是一个好习惯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62156521/

相关文章:

c++ - 比较 C++ 中的两个 STL 列表

C++ Maps 和 Sets 相关查询

c++ - 从集群中读取数据

c++ - std::variant<>::get() 不能用 Apple LLVM 10.0 编译

c++ - 将元素插入链表

c++ - 最小 GCC C++ 编译器

c++ - 如何正确地将 boost::optional<std::chrono::duration> 作为函数参数?

STL vector+sort+equality vs. unordered_set vs. using pure set 的性能(内存和速度方面)

c++ - 计算任意多边形的符号距离变换

c++ - C++ 中的 xvalue 是什么