Code: Select all
#include
#include "ClassA.h"
class Wrapper {
public:
static float square(float x);
static float reciprocal(float x);
static void setImplementation(ClassA *impl);
private:
static ClassA *classA;
};
< /code>
wrapper.cpp:
#include "Wrapper.h"
ClassA *Wrapper::classA = nullptr;
float Wrapper::square(float x) { return classA->square(x); }
float Wrapper::reciprocal(float x) { return classA->reciprocal(x); }
void Wrapper::setImplementation(ClassA *impl) { classA = impl; }
< /code>
classa.h:
#include
class ClassA {
public:
virtual ~ClassA() = default;
virtual float square(float x);
virtual float reciprocal(float x);
};
< /code>
classa.cpp:
#include "ClassA.h"
float ClassA::square(float x) {
float y = x * x;
return y;
}
float ClassA::reciprocal(float x) {
float y = 1.0f / x;
return y;
}
< /code>
Wenn ich dann eine der Funktionen über den Wrapper aufruft < /p>
ClassA classA;
Wrapper::setImplementation(&classA);
static volatile float value = 0.6f;
static volatile float test = Wrapper::reciprocal(value);
< /code>
Es scheint, dass immer alle Funktionen von Classa (in diesem Fall zwei) in binär sind, selbst sie werden nicht genannt. Im Allgemeinen entfernen Sie die nicht verwendete Funktion aus den binären Werken, nur wenn dieses Konstrukt verwendet wird, nicht. Beispiel ist: < /p>
arm-none-eabi-g++ -mcpu=cortex-m0plus -march=armv6-m -mthumb -mlittle-endian -mfloat-abi=soft \
-ggdb -Os -flto=auto -ffunction-sections -fdata-sections -fsingle-precision-constant \
-fno-rtti -fno-exceptions -Wno-register \
-Wno-pedantic -Wno-unused-parameter -Wall -Wextra -Wpedantic -Wdouble-promotion \
-DARM_MATH_CM0 -DCBOR_NO_HALF_FLOAT_TYPE -DDEBUG \
-nostartfiles --specs=nano.specs --specs=nosys.specs -Wl,--gc-sections,-no-wchar-size-warning \
-Wl,-e,main,-Map=output.map -T/workspaces/mspm0g1519.lds \
-I/workspaces/src/sandbox \
-o output.elf \
/workspaces/src/main.cpp \
/workspaces/src/sandbox/ClassA.cpp \
/workspaces/src/sandbox/Wrapper.cpp