Чтобы переменные помещались в указанную память для чтения, только в памяти, они должны быть помечены атрибутом, который помещает их в назначенный раздел, содержимое которого будет помещено в постоянную память.
Было бы полезно иметь возможность программно определять, какие раздел, в котором хранится переменная, чтобы я мог определить во время компиляции, какие переменные будут храниться в ОЗУ (и, следовательно, могут использовать обычное разыменование указателя и чтение ссылок), а какие переменные будут храниться в ПЗУ (и, следовательно, потребуют специального кода доступа, написанного на ассемблере).
Имея доступ к такой функции, я мог бы сделать что-то вроде:
Код: Выделить всё
template
struct data_pointer
{
Type * pointer;
data_pointer(Type * pointer, bool) :
pointer { pointer } {}
// Non-const data cannot be readonly
Type & operator *()
{
return *pointer;
}
};
template
struct data_pointer
{
const Type * pointer;
bool is_readonly;
data_pointer(const Type * pointer, bool is_readonly) :
pointer { pointer },
is_readonly { is_readonly }
{}
// Const data might be in RAM or ROM
const Type operator *()
{
return (is_readonly ? *pointer : readonly_dereference(pointer));
}
};
#define make_data_pointer(object) \
(data_pointer(&object, is_in_readonly_section(object)))
- — это механизм, с помощью которого считывается указатель на значение в области памяти только для чтения.
Код: Выделить всё
readonly_dereference - — это гипотетический предикат времени компиляции, который необходим для обеспечения бесперебойной работы механизма.
Код: Выделить всё
is_in_readonly_section(object)
Я мог бы обойтись и без него, но его отсутствие означает, что конечный пользователь будет ответственность за обеспечение того, чтобы их data_pointer указывают на правильный тип памяти, что может оказаться гораздо более подверженным ошибкам сценарием, чем если бы компилятор мог нести это бремя.
Подробнее здесь: https://stackoverflow.com/questions/792 ... ble-will-b
Мобильная версия