Lassen Sie uns sagen, dass wir eine Klasse, die wie folgt aussieht:Speicherstruktur eines Nur-Funktion-Objekts?
class A
{
public:
int FuncA(int x);
int FuncB(int y);
int a;
int b;
};
Jetzt, mit nur den beiden ints
in Speicherobjekte dieser Klasse angelegt werden, ich weiß. Das heißt, wenn ich einen Vektor von Instanzen der Klasse A
mache, wird es zwei ints
für eine Instanz geben, gefolgt von zwei ints
für die zweite Instanz usw. Die Objekte sind POD.
Aber lassen Sie uns sagen, dass die Klasse wie folgt aussieht:
class B
{
public:
int FuncA(int x);
int FuncB(int y);
};
Was tun Objekte dieser Klasse aussehen wie in Erinnerung? Wenn ich einen Vektor mit Instanzen von B
fülle ... was ist in dem Vektor? Mir wurde gesagt, dass nicht-virtuelle Member-Funktionen am Ende als freie Funktionen kompiliert werden, irgendwo völlig unabhängig von den Instanzen der Klasse, in der sie deklariert sind (virtuelle Funktion auch, aber die Objekte speichern eine vtable mit Funktionszeigern) . Dass die Zugriffsbeschränkungen lediglich auf der semantischen, "menschlichen" Ebene liegen. Nur die Datenelemente einer Klasse (und die vtable usw.) bilden tatsächlich die Speicherstruktur von Objekten.
Also wieder, was sehen Objekte der Klasse B
im Speicher aus? Ist es eine Art Platzhalterwert? Etwas muss da sein, ich kann die Adresse des Objekts nehmen. Es muss auf etwas zeigen. Was auch immer es ist, darf der Compiler diese Objekte inline/optimieren und die Methodenaufrufe als normale freie Funktionsaufrufe behandeln? Wenn ich einen Vektor von diesen erzeuge und die gleiche Methode für jedes Objekt anrufe, kann der Compiler den Vektor eliminieren und ihn durch eine Menge normaler Aufrufe ersetzen?
Ich bin nur neugierig.
Es ist mir aufgefallen, dass Sie einen Kapselungs-Wrapper für Funktionen, die * nein * Platz brauchen, verwenden könnten, Sie könnten einen Namespace anstelle einer Klasse verwenden. Alternativ, wenn Sie die Elementfunktionen statisch machen, müssen Sie niemals ein Objekt instanziieren, um auf sie zuzugreifen, so dass es keinen Platz benötigt. – Clifford