gpt4 book ai didi

C++设计模式以避免固定大小数组的模板

转载 作者:太空宇宙 更新时间:2023-11-04 12:35:39 26 4
gpt4 key购买 nike

在不允许动态内存分配的系统中(即不使用 std::vector 等),在不使用模板的情况下制作固定大小的缓冲区类的好方法是什么?

A 注意到由于重复代码生成,我的可执行文件大小开始增加。

目前我有一个类似的模式,注意Fifo不一定是实际应用,只是一个简化的例子。

template <int S>
class FixedSizeFifo
{
private:
std::array<uint8_t, S> mBuf;
public:
PushFunction() {...}
PopFunction() {...}
};
FixedSizeFifo<1000> myTransmitFifo;
FixedSizeFifo<100> myReceiveFifo;

我的第一个明显的解决方案是先分配存储,然后将指针和大小传递给 Fifo 类,但它需要更多的初始化代码和指针管理等。

class FixedSizeFifo
{
private:
uint8_t * mBuf;
size_t mBufSize;
public:
FixedSizeFifo() = delete; // And other copy constructors/operators
FixedSizeFifo(uint8_t * buf, size_t s) : mBuf(buf), mBufSize(s) {}
PushFunction() {...}
PopFunction() {...}
};
std::array<uint8_t, 1000> txBuf;
auto myTransmitFifo = FixedSizeFifo(txBuf.data(), txBuf.size());
std::array<uint8_t, 100> rxBuf;
auto myReceiveFifo = FixedSizeFifo(rxBuf.data(), rxBuf.size());

对于像这样的固定大小的存储应用程序,还有哪些其他有趣的技术?

谢谢...

最佳答案

对于此类问题,有三种常见的解决方案。各有利弊:

1 - 模板化你传递给的类/函数(如上面的第一个例子)。这会带来代码膨胀的风险,具体取决于模板实例化的数量和模板类的复杂性。不过,确实有助于编写干净简单的代码。

2 - 传递指针和大小(如上面的第二个示例) - 完全避免使用模板,但确实增加了管理指针的风险,但通常可以轻松缓解这些风险。可能与 C 代码兼容。

3 - 使用与 std::string_view(或嵌入式模板库中的 etl::array_view)或 std::span 类似的设计模式。基本上将指向已分配内存及其大小的指针包装在另一个对象中并将其传递进去。优点是能够在传入的包装器上调用通用函数。但是,您现在在调用代码中有了第三步;创建内存,创建内存包装器,使用包装器调用函数。

关于C++设计模式以避免固定大小数组的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56488656/

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