0

私は Atmel AVR ATmega328p チップを使用しており、作成したファイル fifobuffer.h の FifoBuffer クラスを使用して、さまざまな長さの複数のリング バッファーを作成しようとしています...

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 が返されます。しかし、リング バッファー コンストラクターの呼び出しに 64 のサイズを選択しても 10 のサイズを選択しても、プログラムのサイズ (プログラム メモリ使用量: 1194 バイト、データ メモリ使用量: 11 バイト) は変わらないことがわかりました。リング バッファー コンストラクター呼び出しを 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 に答える