Можно ли определить новый тип памяти. Например, в некоторых компиляторах встроенных систем вы можете сделать это:
__flash const char array[] = "This is memory in flash (not ram) so I can waste it!";
Итак, можно пойти еще более сумасшедшим и определить новый тип памяти (например, SD-карту).
Я в основном спрашиваю, можно ли определить, что такое SD-карта (как получить доступ к данным в ней), а затем объявить переменную в sd-памяти. (каждый раз, когда он видит запись, он вызывает метод sd, каждый раз, когда видит, что он вызывает метод sd):
class SDCard{
public:
void write(void* data,size_t length);
void* read(size_t length);
void* memAlloc(size_t length);
};
__sd char myVar; //Grabs an address in the sd card based on SDCard::memAlloc
myVar = 'A'; //Calls whatever I defined the sd card write operation as
char other = myVar; //Calls whatever I defined the sd card read operation as
Я использую gcc, если я могу сделать что-то особенное с этим (я почти готов изменить источник компилятора, чтобы позволить мне это сделать).
Возможно, что-то подобное, но есть несколько проблем:
struct Vol_t{ //Would represent an SD card an external RAM or any other memory
void write(void* data,size_t len,size_t add) const{}
void* read(size_t len,size_t add) const{}
};
template<Vol_t* sd, class Type,size_t address>
struct MemDef{ //Wrap your type with this (maybe add -> operator support later
void operator=(Type&& data){
sd->write(&data,sizeof(data),address);
}
operator Type&(){
return *reinterpret_cast<Type*>(sd->read(sizeof(Type),address));
}
};
Vol_t SD; //Initialize our SD card
MemDef<&SD,int,0xdeadbeaf> sdVar; //Declare an int variable on the SD card
int main(int argc,char** args){
sdVar = 12; //Writes to the SD card
int local = sdVar; //Reads from the SD card
system("Pause");
}
Проблемы с этим подходом:
- Оптимизатор должен делать каждое чтение/запись ---- не может делать какие-либо оптимизации для переменной, объявленной таким образом. (это основная проблема).
- Это немного неэлегантно (но он выполняет свою работу)
- Вы должны указать, какой адрес памяти использовать (было бы замечательно, если бы компилятор мог каким-то образом отобразить все это из до компиляции и автоматически
Поэтому, возможно, мне нужно добавить ключевое слово в gcc (если это так, пожалуйста, укажите мне в правильном направлении, чтобы начать).
Изменить: есть еще одна проблема с этим подходом. Если тип имеет указатель на другую переменную, эта переменная не будет инициализирована на SD-карте (только указатель будет).