https://gcc.gnu.org/bugzilla/show_bug.cgi?id=43745

--- Comment #10 from Oscar GarcĂ­a <oscargarcia at renesys dot es> ---
This problem can be mitigated using "pointer to interfaces".

Instead of:

class A
{
public:
A();
void FncEatingVTableRamA();
void FncEatingVTableRamB();
void FncEatingVTableRamC();
void FncEatingVTableRamD();
void FncEatingVTableRamE();
void FncEatingVTableRamF();

virtual void FncASingleVirtualFunctionPutAllVTableInRam();
}

I use to change it to:
class IVirtual
{
virtual void FncASingleVirtualFunctionPutAllVTableInRam();
}

class ANotInRamVTable
{
IVirtual* pVirtual;
public:
    A(IVirtual* pV)
    {
       pVirtual=pV
    };
    void FncEatingVTableRamA();
    void FncEatingVTableRamB();
    void FncEatingVTableRamC();
    void FncEatingVTableRamD();
    void FncEatingVTableRamE();
    void FncEatingVTableRamF();

void FncNOTVirtual()
{
    pVirtual->FncASingleVirtualFunctionPutAllVTableInRam();
}

class DerivedA:public IVirtual //Not derived actually
{
//REALIZE DerivedA will have VTABLE in ram because of IVirtual

    ANotInRamVTable aNotInRam;

    DerivedA():aNotInRam(this){};
    void FncASingleVirtualFunctionPutAllVTableInRam();
}

It will not solve the problem, and I agree this is an important obstacle to
make reusable/scalable code in reduced-RAM environments but it helps sometimes.

Reply via email to