Подтвердить что ты не робот

Есть ли разница между этими двумя выражениями?

Так как мой компилятор дает разные статистические данные для этих двух частей кода, мне интересно, что их отличает, если вообще?

Первый:

typedef const struct process_data
{
   uint8_t *name;
   void (*p_func)(void);
} process_data_t;

process_data_t processes = {15,16};

И второй:

typedef struct process_data
{
   uint8_t *name;
   void (*p_func)(void);
} process_data_t;

const process_data_t processes = {15,16};

Обратите внимание, что const определитель перешел от typedefing к определению структуры. Для меня нет никакой разницы между двумя выдержками, но статистика компилятора/компоновщика показывает, что меньшее количество флэш-памяти (платформа - это микроконтроллер с ограниченными ресурсами) потребляется, когда используется вторая часть кода.

4b9b3361

Ответ 1

Существует некоторая свобода, которую компилятор может использовать при интерпретации этих объявлений, но, в общем, здесь есть разница:

  • typedef "говорит": это тип, который всегда const, то есть нет "законного" способа отнять const -nes любой переменной этого типа. Всякий раз, когда вы передаете данные этого типа или указатели на него, они будут const. Конечно, кастинг "работает", но только для другого типа, и может привести к Undefined Поведение.

  • Данные const "говорят": эти данные const, но других данных этого типа может и не быть, поэтому, по крайней мере, некоторое количество "убирания const -nes" ОК между переменными и указателями этого типа. Конечно, если кто-то отбрасывает указатель на эти данные неконстантно, и он действительно находится в памяти только для чтения, у нас проблемы.

Итак, нижняя строка такая же, но есть тонкая разница. Как компилятор интерпретирует это действительно до компилятора. Вполне возможно, что typedef очень редок (это в моем опыте), поэтому компилятор оптимизирован для более распространенного случая.

Ответ 2

Существует разница между объявленными определениями данных const и регулярным const ness, поскольку он становится поведением undefined (по крайней мере, на С++), если вы отбросили const от объекта, который был определен с квалификатором.

За пределами языковой адвокации логика очевидна: мы хотим, чтобы они были частью образа только для чтения, но при этом позволяли обоим людям, которые знают, что они делают, использовать const_cast, потому что есть веские причины для этого.

В C мы имеем примерно такую ​​же мотивацию: помещаем константы в память только для чтения, но допускаем, чтобы касты работали. Когда квалификатор привязан к типу, это не является надежной гарантией того, что пользователь решил, что переменная переходит в постоянную память, поэтому компилятор может ошибаться в стороне от осторожности.

Ответ 3

consts хранятся в памяти только для чтения. Думаю, вы просто перемещаетесь, где находятся данные. Трудно сказать 100%, не видя больше информации.