一次为单个函数声明多个变量的最佳方法是什么?

What is the best way to declare many variables at once for a single function?

我想使用一个函数来搜索可能的消息值列表。例如,消息可能是 '01 02 03' 十六进制,然后我将检查可能的消息是否是其中任何一个。

我不知道在这种情况下最好在哪里声明变量。考虑到我正在使用一个函数,如果我在函数中声明所有可能的消息,那么每次我们收到一条新消息时都会声明和定义 25 条消息,这可能很常见。

否则,我被告知不要使用全局变量,所以我有点烦恼,还考虑到我的函数在一个单独的 cpp 文件中,有自己的头文件。

解决这个问题的一般方法是什么?访问这个函数的时候声明很多局部变量可以吗?

将可能的消息值存储在函数的静态变量中。它只会在您第一次调用该函数时初始化一次。 std::vector 示例:

void f() {
    static const std::vector<std::string> v{"\x010203", "\x040506"};
}

如果初始化过程比较复杂,可以使用单独的函数来完成:

auto create_message_values() {
    std::vector<std::string> v;
    // initialize values
    return v;
}

void f() {
    static const auto v = create_message_values();
}

或者使用 lambda:

 void f() {
        static const auto v = [](){
            std::vector<std::string> v;
            // initialize values
            return v;
        };
    }

您可以使用任何符合您需要的容器。

有几种方法可以解决这个问题,这取决于函数的实现以及这只是一个需要访问 table 消息的函数还是多个函数。

用于 C 或 C++ 的两种方法是指定与访问数据的需要相称的可见性范围:

  • 单个函数中的静态列表需要列表限制函数范围的可见性
  • 源文件中的多个函数的静态列表需要列表限制对源文件范围的可见性

对于使用 class 封装为静态的 C++,私有数据是一种合适的替代方法。该函数可以作为 class 的静态成员公开,也可以作为使用 () 运算符的仿函数公开。

由于您要对每封已处理的邮件进行 table 查找,因此您应该考虑列表的存储方式以及用于执行列表查找的搜索方法。对于 25 条消息,使用简单的查找(例如二分查找)可以减少处理每条消息的开销。

能够通过一次比较多个字节来进行搜索也可以显着提高性能。如果只有一种消息类型构成消息流的大部分,那么在 table/list 中查找消息之前通过简单比较排除该消息类型可能会带来巨大的性能提升。

但是,对搜索性能的考虑应该通过对每条消息的其余处理的考虑来调和。如果查找时间只是总处理时间的一小部分,那么简单将是最好的选择。