因此,如果您打算承载大量数据包,那么这些天内存并不是真正的大笔费用,而且阵列的速度非常快。您也不能依靠switch语句自动生成跳转表,因此,自己生成跳转表方案会更容易。在下面的示例中可以看到,我们假设最多255个数据包。
为了得到以下结果,您需要抽象一下。.我不会解释它是如何工作的,因此希望您对此有所了解。
我将其更新为将数据包大小设置为255(如果您需要更多,则必须对(id <0)||进行边界检查)。(id>长度)。
Packets[] packets = new Packets[255];
static {
packets[0] = new Login(6);
packets[2] = new Logout(8);
packets[4] = new GetMessage(1);
packets[8] = new AddFriend(0);
packets[11] = new JoinGroupChat(7); // etc... not going to finish.
}
public void handlePacket(IncomingData data)
{
int id = data.readByte() & 0xFF; //Secure value to 0-255.
if (packet[id] == null)
return; //Leave if packet is unhandled.
packets[id].execute(data);
}
编辑,因为我在C ++中经常使用跳转表,现在我将展示一个函数指针跳转表的示例。这是一个非常通用的示例,但是我确实运行了它,并且可以正常工作。请记住,您必须将指针设置为NULL,C ++不会像Java中那样自动执行此操作。
#include <iostream>
struct Packet
{
void(*execute)() = NULL;
};
Packet incoming_packet[255];
uint8_t test_value = 0;
void A()
{
std::cout << "I'm the 1st test.\n";
}
void B()
{
std::cout << "I'm the 2nd test.\n";
}
void Empty()
{
}
void Update()
{
if (incoming_packet[test_value].execute == NULL)
return;
incoming_packet[test_value].execute();
}
void InitializePackets()
{
incoming_packet[0].execute = A;
incoming_packet[2].execute = B;
incoming_packet[6].execute = A;
incoming_packet[9].execute = Empty;
}
int main()
{
InitializePackets();
for (int i = 0; i < 512; ++i)
{
Update();
++test_value;
}
system("pause");
return 0;
}
我还要提出的另一点是著名的分而治之。因此,如果最坏的情况是语句,我上面的255个数组的想法可以减少到不超过8个。
即,但是请记住,它变得凌乱且难以快速管理,而我的另一种方法通常更好,但这是在阵列无法削减的情况下使用的。您必须弄清楚用例以及每种情况的最佳使用时间。就像您只需要检查几下就不想使用这两种方法一样。
If (Value >= 128)
{
if (Value >= 192)
{
if (Value >= 224)
{
if (Value >= 240)
{
if (Value >= 248)
{
if (Value >= 252)
{
if (Value >= 254)
{
if (value == 255)
{
} else {
}
}
}
}
}
}
}
}