我有一个分配固定缓冲区数组的类,如下所示。
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成为指针并根据构造函数参数(指定大小)在构造函数中分配内存,则是可能的。但是我认为这将最终导致两次调用内存分配(一次针对整个对象,一次针对指向对象内缓冲区的指针)。有没有一种方法可以更改对象中的缓冲区大小,但只需调用一次内存分配即可?探索这种方法的重点是减少堆内存碎片。
答案 0 :(得分:3)
可以这么说,将有一个对malloc()的调用[在旧的'C'中 思考]。
您正在编写c ++,而不是c,对吧?
在c ++数组中,只有在运行时才知道的大小是std::vector
s。对于习惯于弄脏手的人来说可能有些la脚,但是事实上,您确实有很好的理由不使用std::vector
。 std::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;