Выделяет ли процессор новое место для строки в куче каждый раз, когда указатель msg инициализируется снова?
Строковый литерал в исходном коде представляет массив символов, который существуетдля всего исполнения программы.Таким образом, место для него предоставляется, когда программа начинает выполняться.
Типичный способ, которым компиляторы делают это, помещает строку в раздел с постоянными данными программы.
Или делаетон перезаписывает пространство, на которое указывал «старый» указатель msg (новое пространство не выделено)?
В семантике C каждый раз, когда достигается определение msg
, объект с именем msg
создается и инициализируется так, чтобы указывать на массив символов.
На практике хорошие компиляторы, особенно при включенной оптимизации, распознают, что это не является необходимым для достижения конечных эффектов вашего исходного кода.Для вызова transmit_via_uart(msg, strlen(msg));
хороший компилятор будет знать как значение msg
(относительно раздела программы, в котором хранится строка), так и значение strlen(msg)
, и он будет генерировать инструкции для передачи этих значений transmit_via_uart
без необходимости использовать фактическое хранилище для msg
объекта.
Можно сделать несколько более очевидным значение для компилятора с помощью:
while(1)
{
static const char msg[] = "my message";
transmit_via_uart(msg, sizeof msg - 1);
delay(1000);
}
Объявление msg
какstatic
и const
явно указывают компилятору, что msg
- это постоянный массив неизменяемых данных, а использование sizeof
сообщает компилятору, что значение является фиксированным свойством объекта, а не чем-то, что может быть вычислено во время выполнения.время с strlen
(хотя это все еще технически выражение времени выполнения, а не константа времени компиляции).Низкокачественный компилятор, который не смог оптимизировать исходный код, мог бы лучше работать с этим кодом.