0

我正在使用 Atmel AVR ATmega328p 芯片,我正在尝试使用 FifoBuffer 类在我创建的文件 fifobuffer.h 中创建多个长度不同的环形缓冲区...

class FifoBuffer {

    private:

    uint8_t buf_head;  // Head position, where next character is to be added
    uint8_t buf_tail;  // Tail position, when next character is to be removed
    uint8_t buf_size;  // Size of buffer in number of characters
    uint8_t *buffer;   // Declare buffer pointer

    public:

    FifoBuffer (uint8_t); // Constructor declaration

    uint8_t get () { return buffer[2]; }

    void put (uint8_t character) { }

    void empty () { }

    uint8_t count () { return 10; }

    uint8_t head () { return buf_head; }

    uint8_t tail () { return buf_tail; }

    uint8_t size () { return buf_size; }
};

// Constructor
//
FifoBuffer::FifoBuffer (uint8_t buffer_length) {
    buf_head   = 0;
    buf_tail   = 0;
    buf_size   = buffer_length;
    buffer     = new uint8_t [buffer_length];
    buffer[1] = 20; // Test
    buffer[2] = 16; // Test
    buffer[3] = 32; // Test
}

在我的 main.cpp 文件中,我有...

...

void *operator new(size_t s)     { return malloc(s); }
void *operator new[](size_t s)   { return malloc(s); }
void  operator delete(void *m)   { free(m); }
void  operator delete[](void *m) { free(m); }

#include "fifobuffer.h"

...

FifoBuffer tty_rx_buf(64);
FifoBuffer tty_tx_buf(64);

uint8_t ttt = tty_rx_buf.get();
show_8_bits (ttt, 'n');  
ttt = tty_rx_buf.size();
show_8_bits (ttt, 'n');  

...

现在一切都符合了,.get()返回 16,.size()返回 64,这是我所期望的。但是我观察到程序的大小(程序内存使用:1194 字节,数据内存使用:11 字节)没有改变,无论我为环形缓冲区构造函数调用选择 64 还是 10 的大小。当我只调用 1 个环形缓冲区构造函数时,内存使用量确实发生了变化,分别为 1178 字节和 11 字节。

我担心该buffer = new uint8_t [buffer_length]行并没有真正分配 buffer_length 字节。

我的担心是否合理?有一个更好的方法吗?是的,我对此很陌生。

4

1 回答 1

3

您没有“正确”获得内存报告的原因是编译器没有跟踪malloc()调用中分配的内存:例如,您可能有如下代码:

if (PINSB && 0x01) {
    myPtr = malloc(0x10);
}

上面的示例说明malloc()了由于实际条件(例如输入引脚上的电压电平)而发出或未发出的调用。编译器不知道何时/如何malloc()以及free()将被调用,因此无法跟踪该内存。它跟踪的唯一内存是分配在堆栈上的变量,即没有malloc()调用就分配的内存。为了说明对比:

char dataA[10];   // Counted by compiler as memory
char* dataB = malloc(10); // Not counted by compiler except for the size of the pointer dataB itself.
于 2013-03-12T19:23:33.683 回答