我想使用一个函数来搜索可能的消息值列表。例如,一条消息可能是“ 01 02 03”(十六进制),然后我将检查是否存在可能的消息。
在这种情况下,我不知道最好在哪里声明变量。考虑到我正在使用一个函数,如果我在函数中声明所有可能的消息,则每当我们收到一条新消息时,将声明和定义25条消息,这可能是很常见的。
否则,我被告知不要使用全局变量,因此我有点烦恼,同时考虑到我的函数位于主程序的单独cpp文件中,带有自己的标头。
执行此操作的一般方法是什么?每次访问此函数时都可以声明很多局部变量吗?
答案 0 :(得分:1)
将可能的消息值存储在函数的静态变量中。第一次调用该函数时,它将仅初始化一次。 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;
};
}
您可以使用任何适合您需求的容器。
答案 1 :(得分:1)
要解决此问题,有几种方法,这取决于函数的实现以及这是否只是需要访问消息表的单个函数还是多个函数。
与C或C ++一起使用的两种方法是指定与访问数据的需求相对应的可见性范围:
对于使用class
封装为静态的C ++,私有数据是一种合适的选择。该函数可以作为类的静态成员公开,也可以使用()
运算符公开为函子。
由于将要对每条处理的消息进行表查找,因此应考虑如何存储列表以及用于进行列表查找的搜索方法。使用简单的查询(例如二进制搜索)对25条消息进行处理可以使处理每条消息的开销有所不同。
能够通过一次比较多个字节来进行搜索也可以显着提高性能。而且,如果只有一种消息类型构成了大部分消息流,那么在对表/列表中的消息进行查找之前,通过简单的比较就可以排除该消息类型,这可能会大大提高性能。
不过,应根据对每条消息完成的其余处理的考虑来缓和搜索性能。如果查找时间仅占总处理时间的一小部分,那么简单将是最好的选择。