SomeObj<unsigned int>* Buffer;
char* BufferPtr = MemoryManager::giveMeSomeBytes(resX*resY*sizeof(SomeObj<unsigned int>));
Buffer = new(BufferPtr) SomeObj<unsigned int>[resX*resY];
जब मैं डीबगर के साथ इन पंक्तियों से आगे बढ़ने के लिए, यह मेरे लिए मान दिखाता है चर बफर और BufferPtr:नियुक्ति नया + सरणी + संरेखण
BufferPtr: 0x0d7f004c
Buffer: 0x0d7f0050
मैं सच में समझ में नहीं आता क्यों उन मूल्यों भिन्न होते हैं। जिस तरह से मैं इसे समझता हूं, प्लेसमेंट को आवंटित स्मृति पर वेर डिफॉल्ट कन्स्ट्रक्टर का उपयोग करके सरणी तत्वों को प्रारंभ करने के लिए 'बफरप्रेट' पते से शुरू होने वाली मेमोरी का उपयोग करना चाहिए और सरणी में पहले तत्व के पहले बाइट में पॉइंटर वापस करना चाहिए, जो होना चाहिए प्लेसमेंट नए ऑपरेटर को पास के रूप में बिल्कुल वही बाइट।
क्या मुझे कुछ गलत समझ आया या कोई मुझे बता सकता है कि मूल्य अलग क्यों हैं?
धन्यवाद!
// संपादित करें: ठीक है - मैं इस मुद्दे को आगे की जांच की और मिल गया भ्रामक परिणाम:
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];
डिबगर मुझे मेरे चर के लिए निम्न मान देता है:
size: 4
testPtr1:0x05100418
test1: 0x05100418
testPtr2:0x0da80050
test2: 0x0da80050
testPtr3:0x05101458
test3: 0x0510145c
testPtr4:0x0da81050
test4: 0x0da81054
तो यह स्पष्ट रूप से होना चाहिए मेरे जेनेरिक स्मार्टपॉन्टर क्लास matth_ptr के साथ कुछ करने के लिए है तो यहां यह है:
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
};
};
क्या कोई मुझे बता सकता है कि क्या हो रहा है? धन्यवाद!
मेरे सिर के ऊपर से, संरेखण या VTable स्थान हो सकता है। –
क्या इसका मतलब यह है कि प्लेसमेंट नया ऑब्जेक्ट को उच्च मेमोरी एड्रेस पर बनाता है अगर उसे पास किए गए पते के संरेखण को पसंद नहीं है? – Mat
मुझे संदेह होगा, कुछ निश्चित रूप से नहीं जानते हैं। परीक्षण करने का एक तरीका यह देखना होगा कि यह चयनित मेमोरी लोकेशन पर होता है (यानी एक गठबंधन पता देने के लिए बल दें ISomeBytes)। –