C++ 在类构造函数中分配内存
我正在使用Atmel AVR ATmega328p芯片,我正在尝试创建多个不同长度的环形缓冲区,使用FifoBuffer类,在我创建的FifoBuffer.h文件中C++ 在类构造函数中分配内存,c++,memory,avr,atmel,C++,Memory,Avr,Atmel,我正在使用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 chara
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=newuint8\t[buffer\u 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.
无法“正确”获取内存报告的原因是编译器没有跟踪在
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.
这叫什么?在为微控制器编写代码时,默认情况下不会获得malloc。您使用的是提供malloc实现的库吗?
有malloc()
尽管通常AVR程序是在不使用malloc()的情况下编写的是的,我使用的库是#include#include/#test#include#include#include#include#include#这是什么调用malloc?在为微控制器编写代码时,默认情况下不会获得malloc。你使用的是提供malloc实现的库吗?
有malloc()
虽然通常AVR程序是在没有malloc()的情况下编写的,但是我使用的库是#include#include/#test#include#include#include#Wow@angelatlarge,谢谢。现在有道理了。然后我必须跟踪我在环形缓冲区中使用的内容,并将其添加到编译器知道的内存大小中。由于我在开始时只调用一次构造函数,而且环缓冲区在第一次设置后大小不会改变,有没有更好的方法来设置环缓冲区存储?您想要使用的缓冲区大小不会在运行中改变,对吗?在编译之前/编译时设置一次,然后继续,对吗?是的,@angelatlarge。我将有4个缓冲区,4个固定大小,但每个大小不同,一开始设置一次,并且不会动态更改。要分配堆栈上的所有内容,可以做一件事:在setup()
中分配堆栈上的缓冲区数据数组,使用\define
s指定缓冲区大小,然后在构造每个FifoBuffer
时将指针传递给该对象。它确实稍微破坏了封装,但您可能会认为这是一个合适的价格。这将允许您摆脱new()
和delete
操作符,我想您会同意这有点笨拙。另外,您将确切地知道您的程序占用了多少宝贵的SRAM。你觉得怎么样?哇@angelatlarge,谢谢。现在有道理了。然后我必须跟踪我在环形缓冲区中使用的内容,并将其添加到编译器知道的内存大小中。由于我在开始时只调用一次构造函数,而且环缓冲区在第一次设置后大小不会改变,有没有更好的方法来设置环缓冲区存储?您想要使用的缓冲区大小不会在运行中改变,对吗?在编译之前/编译时设置一次,然后继续,对吗?是的,@angelatlarge。我将有4个缓冲区,4个固定大小,但每个大小不同,一开始设置一次,并且不会动态更改。要分配堆栈上的所有内容,可以做一件事:在setup()
中分配堆栈上的缓冲区数据数组,使用\define
s指定缓冲区大小,然后在构造每个FifoBuffer
时将指针传递给该对象。它确实稍微破坏了封装,但您可能会认为这是一个合适的价格。这将允许您摆脱new()
和delete
操作符,我想您会同意这有点笨拙。另外,您将确切地知道您的程序占用了多少宝贵的SRAM。你怎么认为?