먼저 마이크로 컨트롤러 용 소프트웨어를 만들고 있다고 가정 해 봅시다. RAM 사용에 문제가 없으며 큰 블록의 const 데이터를 비 휘발성 (플래시) 메모리에 저장하는 것이 좋습니다.C++에서 "split object"를 만드는 좋은 방법이 있습니까?
내가 얻으려고하는 것은 C++에서 "분할 된"개체를 만드는 좋은 방법을 찾는 것입니다. 예를 들어, 1 바이트의 데이터 (읽기/쓰기)와이를 액세스하기위한 멀티 바이트 "영수증"이 있다고 가정 해 보겠습니다. "영수증"이 파일 이름 인 긴 문자열이고 그것이 가리키는 미디어가 느린 경우 실제로 각 요청에서 읽는 대신 메모리에있는 단일 바이트를 버퍼링하는 것이 좋습니다.
class Data
{
uint8_t byte;
bool valid;
const char filename[128];
uint8_t read()
{
if (!valid)
performReallySlowRead(filename, &byte);
valid = true;
return byte;
};
void write(uint8_t new_value)
{
byte = new_value;
performRealWriteToMedia(filename, byte);
valid = true;
};
}
이 방법의 명백한 문제는 전체 130 바이트가 RAM으로 끝나고 두 개만 변경해야한다는 것입니다.
class DataNonConst
{
uint8_t byte;
bool valid;
}
class DataConst
{
const char filename[128];
DataNonConst * const data;
}
static DataNonConst storage;
const DataConst holder("some_long_name_here", &storage);
지금 유일한 문제는 (그래서 두를 만드는 나는 그런 몇 백 싶은 경우를 만드는 과정을 분할 - 객체 즉 : 그래서 분할 객체의 아이디어 왔어요 개체와 두 번째 첫 번째 링크) 꽤 지루하고 문제가 생깁니다 ...
그래서 질문은 - 영리한 C++ 트릭이나 어쩌면 일부 템플릿 마법을 사용하기 쉽게 만드는 좋은 방법이 있습니까? 즉, 하나의 문장으로 두 개의 객체를 만들고 서로 연결하는 방법입니다. 하나의 객체는 숨겨져있는 것이 좋습니다. 저장 프로 시저의 이름을 쉽게 생성 할 수있는 자동화 된 방법이 없기 때문에 여기서는 매크로 솔루션이 가능하지 않다고 생각합니다. 개체는 다른 개체에 포인터를 포함해야하므로 동일한 유형이어야합니다. (하나의 함수는 이들을 작성하는 데 중점을 둡니다. 다른 하나는 읽기에만 신경을 씁니다) ... 내가 생각한 모든 솔루션은 템플릿에 가상 인터페이스를 사용해야합니다 (따라서 vtable 포인터로 객체를 더 크게 만들고 보너스 템플릿을 얻습니다.) 길가에 "바인딩"익명의 변수가 -
실제로 전체 문제의 일부는 더 간단 질문에 줄일 수 있습니다 -bloat) 또는 편집
... 거대한 템플릿 팽창을 초래할 C++의 멤버 필드? 같은 STH : 위의 "희망 사항"홀더에서
const ConstData holder("...", NonConstData()); // this object HAS TO be ROMable
이 ROM에서 const를 객체이며 익명 객체 NonConstData에 RAM에 "어딘가"만든 어떤 포인터/참조 /가
. 또는 : 내가 수동으로 두 객체를 생성하고 다른 하나를 바인딩하지 수있는 것std:pair<const ConstData &, NonConstData &> holder(ConstData(), NonConstData());
아무것도.
당신은 정수로 포인터를 교체하고이 같은 모든DataNonConst
객체를 단일 정적 배열, 만들 수 있습니다
필요 무엇? – Ation
ROM이 가능하여 RAM이 아닌 비 휘발성 메모리에 저장됩니다. 이것은 주제에 대해 매우 중요합니다 ... –
매크로 솔루션에 관해서 - 당신은 매크로에 대한 인수로서 스토리지 객체의 이름을 전달할 수 없었습니까? –