创建具有不同缓冲区大小的对象

时间:2019-07-03 09:08:33

标签: c++

我有一个分配固定缓冲区数组的类,如下所示。

class CMyBuffer
{
public:
    CMyBuffer() { /* constructor ... */ }
    ~CMyBuffer() { /* destructor ... */ }

    int copy(char *source, int len);

    char        m_szBuf[MYBUF_SIZE * sizeof(char)];
    int         m_nLen;
};

创建此类的对象时,将为该对象分配内存,包括大小为MYBUF_SIZE的固定缓冲区。可以这么说,将调用malloc()[在古老的C语言中)。

我想知道是否可以根据构造函数参数更改缓冲区大小。当然,如果使m_szBuf成为指针并根据构造函数参数(指定大小)在构造函数中分配内存,则是可能的。但是我认为这将最终导致两次调用内存分配(一次针对整个对象,一次针对指向对象内缓冲区的指针)。有没有一种方法可以更改对象中的缓冲区大小,但只需调用一次内存分配即可?探索这种方法的重点是减少堆内存碎片。

2 个答案:

答案 0 :(得分:3)

  

可以这么说,将有一个对malloc()的调用[在旧的'C'中   思考]。

您正在编写c ++,而不是c,对吧?

在c ++数组中,只有在运行时才知道的大小是std::vector s。对于习惯于弄脏手的人来说可能有些la脚,但是事实上,您确实有很好的理由不使用std::vectorstd::vector很少能够完成动态数组所需的操作。

  

我想知道是否可以根据   构造函数参数。

是的,当然:

class CMyBuffer
{
public:
    CMyBuffer(size_t size) : m_szBuf(size) { /* constructor ... */ }
    ~CMyBuffer() { /* destructor ... */ }

    int copy(char *source, int len);   
    std::vector<char> m_szBuf;
};

您也不需要自己跟踪向量的大小(即c思维;)。

也许您认为std::vector很好,但是它对我没有帮助,因为我在代码的某些地方仍然需要char*。但是,std::vector可以使您通过std::vector::data()访问基础数组。

答案 1 :(得分:0)

如果只有几个预期大小的缓冲区,并且在编译时就知道它们,则可以使用模板为每种大小生成类:

template <size_t N>
class CMyBuffer
{
    public:
        char m_szBuf[N * sizeof(char)];
        int  m_nLen = N;
};

// usage
CMyBuffer<MYBUF_SIZE> buff;
CMyBuffer<256> buffBig;