Оператор новый для Arduino

Мне сказали (в частности, в ответ на Стандартная библиотека C ++ на Arduino, и в вопросе переполнения стека C ++ строка и Arduino String. Как их совместить?)) что компилятор Arduino не реализует new оператор. Тем не менее, я написал программу для Arduino (в Arduino IDE), которая ее использует, и она отлично работает.

void setup() {
Serial.begin(9600);
}

void loop() {
char* array;
char c;
unsigned arraySize;

Serial.write("Enter a 1 digit number.\n");

do {
c = Serial.read();
} while(c < '0' or c > '9');
arraySize = c-'0';

Serial.write("You wrote ");
Serial.write(c);
Serial.write(".\n");
Serial.write("Now enter ");
Serial.write(c);
Serial.write(" lower-case letters.\n");

array = new char[arraySize];

for (unsigned i = 0; i < arraySize;) {
array[i] = Serial.read();
if (array[i] >= 'a' and array[i] <= 'z')
i++;
}

Serial.write("You entered: ");

for (unsigned i = 0; i < arraySize; i++) {
Serial.write(array[i]);
Serial.write(" ");
}
Serial.write("\n");
}

Вот пример вывода, чтобы продемонстрировать его функциональность:

Enter a 1 digit number.
You wrote 5.
Now enter 5 lower-case letters.
You entered: h e l l o
Enter a 1 digit number.
You wrote 9.
Now enter 9 lower-case letters.
You entered: w a s s u p m a n
Enter a 1 digit number.
You wrote 9.
Now enter 9 lower-case letters.
You entered: h o w y a d o i n
Enter a 1 digit number.
You wrote 4.
Now enter 4 lower-case letters.
You entered: c o o l
Enter a 1 digit number.
You wrote 7.
Now enter 7 lower-case letters.
You entered: i t w o r k s
Enter a 1 digit number.

Так почему я продолжаю слышать это? Эти люди не правы или я просто неправильно понимаю их значение?

2

Решение

new а также delete определяется как часть дистрибутива Arduino:
/usr/share/arduino/hardware/arduino/cores/arduino/new.h:

/* Header to define new/delete operators as they aren't provided by avr-gcc by default
Taken from http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453
*/
#ifndef NEW_H
#define NEW_H

#include <stdlib.h>

void * operator new(size_t size);
void operator delete(void * ptr);

__extension__ typedef int __guard __attribute__((mode (__DI__)));

extern "C" int __cxa_guard_acquire(__guard *);
extern "C" void __cxa_guard_release (__guard *);
extern "C" void __cxa_guard_abort (__guard *);

extern "C" void __cxa_pure_virtual(void);

#endif

new.h входит в Printable.h Таким образом, вы получаете его в ваших основных Arduino включает. Эти операторы не определены в AVR Libc. Моя интерпретация этих вариантов дизайна: люди из Libc думали, что это плохая идея, тогда как люди из Arduino все об удобстве использования: если хотите new а также deleteПожалуйста, имейте их.

12

Другие решения

Как вы показали, new а также delete делать работа в принципе на Arduino. Проблема в том, что ваш Arduino имеет 2 КБ ОЗУ для глобальных переменных, стека и кучи комбинированный, поэтому любая существенная программа, которую вы пишете для нее, должна быть хорошо осведомлена об использовании памяти.

Поэтому для подобной встроенной системы, как правило, предпочтительнее использовать статическое распределение (или, возможно, динамическое распределение для класса в некоторых ситуациях), а не динамическое распределение общего назначения: для простых программ вы не необходимость динамическое распределение, а для сложных программ вы не можете позволить себе Это.

9

Просто потому, что платформа не предопределяет operator new() не значит что вы не могу определить это. В вашем коде, вероятно, кто-то напишет определение для функции распределения, так что все хорошо.

(Я полагаю, вы знакомы с разницей между new выражение и функция распределения, которая вызывающе называется operator new().)


Вот детское определение примера, которое должно запустить короткую программу:

char buf[1024];
char * cur = buf;

void * operator new(std::size_t n)
{
char * res = cur;
std::size_t inc = (n + 15) / 16 * 16;

if (std::distance(cur, buf + sizeof(buf)) < inc)
throw std::bad_alloc();

cur += inc;

return res;
}

void operator delete(void * p) noexcept
{
}

Это, очевидно, очень быстро исчерпает память.

1