Есть ли разница между этими двумя выражениями?
Так как мой компилятор дает разные статистические данные для этих двух частей кода, мне интересно, что их отличает, если вообще?
Первый:
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%, не видя больше информации.