我正在使用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的大小。当我只进行一次环形缓冲区构造函数调用时,内存使用确实会改变,分别为1178字节和11字节。
我担心buffer = new uint8_t [buffer_length]
行并没有真正分配buffer_length字节。
我的担忧是否合理?有一个更好的方法吗?是的,我是新人。
答案 0 :(得分: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.