몇 년 전에 베어 메탈 (Cortex-M) 프로젝트를 시작했습니다. 프로젝트 설정에서 우리는 gcc toolchain을 C++ 11/C++ 14 등으로 사용하기로 결정했고 C++ 예외 및 rtti를 사용하기도했습니다.템플릿 인스턴스화 및 기호 테이블에서 C++ 코드가 부 풀리지 않도록하려면?
우리는 현재 gcc 4.9 from launchpad.net/gcc-arm-embedded (최근 gcc 버전으로 업데이트하지 못하게하는 문제가 있음)을 사용하고 있습니다. 그래서 내 클래스의 고객이 지금 예를 사용할 수 있음을
class OutStream {
public:
explicit OutStream() {}
virtual ~OutStream() {}
OutStream& operator << (const char* s) {
write(s, strlen(s));
return *this;
}
virtual void write(const void* buffer, size_t size) = 0;
};
class FixedMemoryStream: public OutStream {
public:
explicit FixedMemoryStream(void* memBuffer, size_t memBufferSize): memBuffer(memBuffer), memBufferSize(memBufferSize) {}
virtual ~FixedMemoryStream() {}
const void* getBuffer() const { return memBuffer; }
size_t getBufferSize() const { return memBufferSize; }
const char* getText() const { return reinterpret_cast<const char*>(memBuffer); } ///< returns content as zero terminated C-string
size_t getSize() const { return index; } ///< number of bytes really written to the buffer (max = buffersize-1)
bool isOverflow() const { return overflow; }
virtual void write(const void* buffer, size_t size) override { /* ... */ }
private:
void* memBuffer = nullptr; ///< buffer
size_t memBufferSize = 0; ///< buffer size
size_t index = 0; ///< current write index
bool overflow = false; ///< flag if we are overflown
};
: 예를 들어
, 나는 기본 클래스와 같은 파생 클래스 (또한 실행 참조 예 here)를 쓴 것
template<size_t bufferSize> class FixedMemoryStreamWithBuffer: public FixedMemoryStream {
public:
explicit FixedMemoryStreamWithBuffer(): FixedMemoryStream(buffer, bufferSize) {}
private:
uint8_t buffer[bufferSize];
};
: 이제
char buffer[10];
FixedMemoryStream ms1(buffer, sizeof(buffer));
ms1 << "Hello World";
내가 클래스의 사용이 좀 더 편안하게하고 싶은 것은 다음과 같은 템플릿을 도입 16,
그리고 지금부터, 내 고객이 쓸 수 있습니다 :
FixedMemoryStreamWithBuffer<10> ms2;
ms2 << "Hello World";
하지만 지금부터, 내 실행 가능한 바이너리의 크기를 증가 동안 있었던
. gcc는FixedMemoryStreamWithBuffer
의 각기 다른 템플릿 인스턴스화에 대한 심볼 정보를 추가 한 것 같습니다 (우리는 어떤 이유로 rtti를 사용하고 있기 때문입니다).
일부 특정 클래스/템플릿/템플릿 인스턴스화에 대한 심볼 정보 만 제거 할 수있는 방법이 있습니까?
휴대용이 아닌 gcc 전용 솔루션을 사용하는 것이 좋습니다.
우리는 전처리 매크로 대신 템플릿을 선호하기 때문에 전 처리기 솔루션을 피하고 싶습니다.
당신이 제거하면 가상 기능 : 나는 내부의 변환 기능 및/또는 연산자로 봉쇄하는 대신 상속을 사용하는 것이 좋습니다 것입니다 문제를 해결하기 위해
? 다형성 객체 만 RTTI를 사용할 수 있습니다. – Quentin
'OutStream'에서 파생 된 다른 클래스 (예 : UartStream, TcpStream 등)가 있으므로 가상 함수가 반드시 필요합니다. – Joe
이러한 파생 클래스를 다형성으로 (즉, 기본 클래스의 형식을 통해) 사용하는 경우에만 필요합니다. – Quentin