Beachte das, was Drakon gesagt hat. da du es aber trotzdem nicht tun wirst, ein paar Hinweise:
Wie verhalten sich unsigned char, short und int was die Speicherung betrifft?
Ist es wirklich lohnenswert den jeweils "kleinsten" Datentyp zu wählen, oder macht das auch bei massiver Nutzung keinen merkbaren Unterschied?
Das darauf an, was du machst: Mit dem Standardinteger wird bei den meisten Implementierungen am schnellsten gerechnet, dafür braucht er mehr Speicherplatz. Ist Rechenzeit das Problem, ist also der int Typ besser, ist Speicherplatz oder Speicherperformance das Problem, können kleinere Typen helfen. Dies gilt für die meisten Prozessortypen, ist aber kein allgemeines Prinzip.
Wäre es sinnvoll, für einen Wertebereich von [0, 4] eine enumeration einzusetzen, oder wird das intern sowieso z.B. als int gespeichert?
enum ist dazu da, dir das Programmieren zu erleichtern. enumerations haben aber keine besonderen Assemblerbefehle, sie werden mit den Standardmitteln so umgesetzt wie der Compilerbauer es für sinnvoll hält.
Dann noch eine Frage zu struct und class:
macht es einen Geschwindigkeitsunterschied, ob man z.B. einen Vektor in einer Klasse speichert und über einen getter an die einzelnen Elemente kommt,
oder ob man den Vektor in einem struct speichert und die Werte dann über "v.x" addressiert? Alles ist wohlgemerkt unter massiver Nutzung zu betrachten.
Höchstens wenn du explizit ohne Optimierung compilierst, getter und setter sind sehr leicht wegzuoptimieren. Du willst hier wieder den Fehler machen, die saubere Programmierung voreilig zugunsten nichtsbringender Optimierung aufzugeben.