gpt4 book ai didi

c++ - 参数的编译时处理

转载 作者:行者123 更新时间:2023-11-28 00:26:20 25 4
gpt4 key购买 nike

我必须将来自两个数据通道的一些数据吃到两个队列中。从每个特定 channel 吃掉的数据必须写入其各自的队列。

因此我有一个功能:

void eatData(channel c, channel id)
{
while (true)
{
if (channelid == 1)
{
write to queue 1;
}
else
{
write to queue 2;
}
}
}

注意 while 循环我正在轮询数据,应用程序非常非常时间敏感。有没有一种方法可以摆脱那些 if 条件而无需像这样编写两个不同的函数:

void eatDataFromChannelOneAndWriteToQueueOne()
void eatDataFromChannelTwoAndWriteToQueueTwo()

可以用模板来解决吗?

最佳答案

由于此代码时间敏感,我建议您使用队列的std::vector:

static std::vector<Queue_Type> data_container(MAXIMUM_CHANNELS);

void Collect_Data(const& Datum d,
unsigned int channel_number)
{
data_container[channel_number].insert_value(d);
}

上面的代码使用了 std::vector 构造函数来指定 vector 的初始元素数。动态调整 vector 大小是浪费时间。此外,固定的初始大小允许将 vector 视为数组而无需调整大小。

对于循环队列,我建议使用 2 的幂的容量,这样您就可以使用二进制 AND 运算而不是模运算。我们进行了此更改,性能显着提高,特别是因为我们的处理器没有任何除法或模指令。

编辑 1:
如果您的问题是从多个端口读取,那么您可以将分配置于一个永远的循环中:

void Read_Multiple_Ports(void)
{
unsigned int channel_number = 0;
while (true)
{
const Datum d = Read_Channel(channel_number);
data_container[channel_number].insert_value(d);
++channel_number;

// Use if statement rather than modulo
// because modulo (division) may be more time
// expensive than a jump.
// If the number of channels is a power of 2,
// this could be replaced by an arithmetic AND
// to mask the value.
if (channel_number >= MAXIMUM_CHANNELS)
{
channel_number = 0;
}
}
}

关于c++ - 参数的编译时处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24841327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com