2011-11-28 12 views
7

Podemos utilizar la ubicación nueva para crear un objeto en la memoria preasignada.Crear objetos en la memoria preasignada

Consideremos el siguiente ejemplo:

char *buf = new char[1000]; //pre-allocated buffer 
string *p = new (buf) MyObject(); //placement new 
string *q = new (buf) MyObject(); //placement new 

He creado dos objetos en el búfer preasignado. ¿Los dos objetos se crean aleatoriamente dentro del búfer o se crean en bloques de memoria contiguos? Si seguimos creando más objetos en el búfer y queremos que se almacenen en bloques de memoria contiguos, ¿qué deberíamos hacer? Primero crea una matriz en el búfer y luego crea cada objeto en las ranuras del elemento de la matriz.

+1

"Si seguimos creando más objetos en el búfer y queremos que se almacenen en bloques de memoria contiguos, ¿qué deberíamos hacer?" Use 'std :: vector', es una matriz dinámica almacenada contiguamente. – GManNickG

Respuesta

5

Ambos objetos se crean en la misma ubicación de memoria, es decir, buf. Esto es comportamiento indefinido (a menos que los objetos sean POD).

Si desea asignar varios objetos, debe aumentar el puntero, p. buf + n * sizeof(MyObject), pero tenga cuidado con los problemas de alineación

Además, no olvide llamar a los destructores cuando haya terminado.

+1

Como el búfer se asignó con 'new', tiene alineación para admitir cualquier tipo (incluidas las matrices). (No es que estés equivocado en general, solo que en este caso está a salvo.) – GManNickG

+0

@GMan: Gracias, buen punto. Supongo que se necesita atención adicional si desea colocar objetos de diferentes tipos en la memoria. –

+0

+1 Por cierto, ¿qué significa POD aquí? –

3

La siguiente línea de código:

string *p = new(adr) MyObject(); 

creará un objeto MiObjeto en la dirección ADR. A continuación, la próxima vez que se crea otro objeto, sabrá que la memoria a adr está siendo utilizado por el primer objeto, por lo que su siguiente objeto tendrá que ser creado en adr + sizeof(MyObject):

string *q = new(adr + sizeof(MyObject)) MyObject(); 

El punto de pre-memoria es para que no esté asignando en tiempo de ejecución, lo cual es bastante lento. Hace una gran asignación al principio del bucle/programa y luego solo tiene que usar fragmentos de esa asignación. La desventaja es que tienes que administrar tu propia memoria, lo que significa que tienes que descubrir dónde poner tus objetos, lo que se complica cuando tu grupo de memoria se fragmenta.

+0

if adr = static_cast (byteaddr) entonces harías: string * q = new (adr + 1) MyObject(); –

Cuestiones relacionadas