SomeObj<unsigned int>* Buffer;
char* BufferPtr = MemoryManager::giveMeSomeBytes(resX*resY*sizeof(SomeObj<unsigned int>));
Buffer = new(BufferPtr) SomeObj<unsigned int>[resX*resY];
cuando me paso más allá de estas líneas con el depurador, que me muestra los valores de las variables de amortiguación y BufferPtr:colocación nueva gama + + alineación
BufferPtr: 0x0d7f004c
Buffer: 0x0d7f0050
Realmente no entiendo por qué esos valores diferir de. Tal como lo entiendo, la colocación nueva debe usar la memoria que comienza en la dirección 'BufferPtr' para inicializar los elementos de la matriz utilizando sus constructores predeterminados en la memoria asignada y devolver un puntero al primer byte del primer elemento de la matriz, que debería ser exactamente el mismo byte que se pasó al nuevo operador de ubicación.
¿He entendido algo mal o alguien me puede decir por qué los valores son diferentes?
gracias!
// editar: bien - he investigado la cuestión y dieron resultados más confusos:
int size = sizeof(matth_ptr<int>);
char* testPtr1 = (char*)malloc(a_resX*a_resY*sizeof(int));
int* test1 = new(testPtr1) int[a_resX*a_resY];
char* testPtr2 = mmgr::requestMemory(a_resX*a_resY*sizeof(int));
int* test2 = new(testPtr2) int[a_resX*a_resY];
char* testPtr3 = (char*)malloc(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test3 = new(testPtr3)matth_ptr<int>[a_resX*a_resY];
char* testPtr4 = mmgr::requestMemory(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test4 = new(testPtr4)matth_ptr<int>[a_resX*a_resY];
el depurador me devuelve los siguientes valores para mis variables:
size: 4
testPtr1:0x05100418
test1: 0x05100418
testPtr2:0x0da80050
test2: 0x0da80050
testPtr3:0x05101458
test3: 0x0510145c
testPtr4:0x0da81050
test4: 0x0da81054
por lo que claramente debe tener algo que ver con mi genérico smartpointer clase matth_ptr así que aquí está:
template <class X> class matth_ptr
{
public:
typedef X element_type;
matth_ptr(){
memoryOfst = 0xFFFFFFFF;
}
matth_ptr(X* p)
{
unsigned char idx = mmgr::getCurrentChunkIdx();
memoryOfst = (int)p-(int)mmgr::getBaseAddress(idx);
assert(memoryOfst<=0x00FFFFFF || p==0);//NULL pointer is not yet handled
chunkIdx = idx;
}
~matth_ptr() {}
X& operator*() {return *((X*)(mmgr::getBaseAddress(chunkIdx)+(memoryOfst&0x00FFFFFF)));}
X* operator->() {return ((X*)(mmgr::getBaseAddress(chunkIdx)+(memoryOfst&0x00FFFFFF)));}
X* get() {return ((X*)(mmgr::getBaseAddress(chunkIdx)+(memoryOfst&0x00FFFFFF)));}
template<typename T>
matth_ptr(const matth_ptr<T>& other) {memoryOfst=other.memoryOfst;}//put these two operators into the private part in order to prevent copying of the smartpointers
template<typename T>
matth_ptr& operator=(const matth_ptr<T>& other) {memoryOfst = other.memoryOfst; return *this;}
template<typename T>
friend class matth_ptr;
private:
union //4GB adressable in chunks of 16 MB
{
struct{
unsigned char padding[3]; //3 bytes padding
unsigned char chunkIdx; //8 bit chunk index
};
unsigned int memoryOfst; //24bit address ofst
};
};
¿Alguien puede explicarme qué está pasando? ¡Gracias!
Fuera de la parte superior de mi cabeza, podría haber alineación o espacio en la VTable. –
¿significa eso que la colocación nueva crea un objeto simplemente en una dirección de memoria más alta si no le gusta la alineación de la dirección pasada? – Mat
Sospecho que sí, aunque no estoy seguro. Una forma de probarlo sería ver si esto sucede en la ubicación de la memoria seleccionada (es decir, forzar giveMeSomeBytes para dar una dirección alineada). –