Digamos que tenemos una clase que tiene este aspecto:Estructura de la memoria de un objeto que solo funciona?
class A
{
public:
int FuncA(int x);
int FuncB(int y);
int a;
int b;
};
Ahora, sé que quedan dispuestas objetos de esta clase en la memoria con sólo los dos ints
. Es decir, si hago un vector de instancias de la clase A
, habrá dos ints
para una instancia, seguidos de dos ints
para la segunda instancia, etc. Los objetos son POD.
pero digamos que la clase tiene este aspecto:
class B
{
public:
int FuncA(int x);
int FuncB(int y);
};
Qué hacer objetos de esta clase como mirada en la memoria? Si llene un vector con instancias de B
... ¿qué hay en el vector? Me han dicho que las funciones de miembros no virtuales se compilan finalmente como funciones gratuitas en algún lugar sin relación alguna con las instancias de la clase en la que se declaran (las funciones virtuales también lo son, pero los objetos almacenan un vtable con punteros de función) . Que las restricciones de acceso son meramente a nivel semántico, "humano". Solo los miembros de datos de una clase (y el vtable, etc.) realmente componen la estructura de memoria de los objetos.
De nuevo, ¿cómo son los objetos de la clase B
en la memoria? ¿Es algún tipo de valor de marcador de posición? Algo tiene que estar allí, puedo tomar la dirección del objeto. Tiene que apuntar a algo. Sea lo que sea, ¿se permite al compilador alinear/optimizar estos objetos y tratar las llamadas a métodos como solo llamadas normales a funciones libres? Si creo un vector de estos y llamo al mismo método en cada objeto, ¿puede el compilador eliminar el vector y reemplazarlo con solo un montón de llamadas normales?
Solo tengo curiosidad.
Se me ocurrió que si se desea una envoltura de encapsulación para las funciones que lleva * * hay espacio, se puede utilizar un espacio de nombres en lugar de una clase. Alternativamente, si hace que las funciones miembro estén estáticas, nunca necesitará crear una instancia de un objeto para acceder a ellas de manera similar, no requiere espacio. – Clifford