Я использую чип 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.
Оправдано ли мое беспокойство? Есть лучший способ сделать это? Да, я новичок в этом.
Причина, по которой вы не получаете отчет о памяти «правильно», заключается в том, что компилятор не отслеживает память, выделенную в 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.
Других решений пока нет …