我想使用一个函数来搜索可能的消息值列表。例如,消息可能是'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;
};
}
您可以使用任何符合您需求的容器。
有几种方法可以解决这个问题,它取决于函数的实现以及这只是一个需要访问消息表或多个函数的函数。
与C或C ++一起使用的两种方法是指定与访问数据的需求相称的可见范围:
对于使用class
封装为静态的C ++,私有数据是一种合适的替代方法。该函数可以作为类的静态成员公开,或者使用()
运算符作为仿函数公开。
由于您要对处理的每个消息进行表查找,因此您应该考虑如何存储列表以及用于执行列表查找的搜索方法。使用诸如二进制搜索的简单查找的25个消息可以在处理每个消息的开销上产生差异。
能够通过一次比较多个字节来进行搜索也可以显着提高性能。如果存在构成消息流的大部分的单个消息类型,则在对表/列表中的消息进行查找之前通过简单比较来排除该消息类型可能是巨大的性能增益。
但是,对于每个消息所做的其余处理的考虑因素,应该考虑搜索性能的考虑因素。如果查找时间只是总处理时间的一小部分,那么简单性将是最佳选择。