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

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

Первый:

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 к определению структуры. Для меня нет никакой разницы между двумя выдержками, но статистика компилятора/компоновщика показывает, что меньшее количество флэш-памяти (платформа - это микроконтроллер с ограниченными ресурсами) потребляется, когда используется вторая часть кода.

Ответы

Ответ 1

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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