के साथ नया प्लेसमेंट मेरे पास MyType
का एक ऑब्जेक्ट है, जो एसएसई कारणों से 16-बाइट गठबंधन होना आवश्यक है। इसलिए, मैंने एक आवंटक लिखा और new
ऑपरेटरों को अधिभारित किया। MyType
में तरीके:ओवरलोडेड सामान्य नए ऑपरेटर
void MyType::copy_into(uint8_t* ptr) const {
new (reinterpret_cast<MyType*>(ptr)) MyType(*this);
}
जीसीसी मुझसे कहता है:
inline static void* operator new(size_t size) {
awesome::my_allocator<MyType,16> alloc;
return alloc.allocate(size);
}
inline static void* operator new[](size_t size) { return operator new(size); }
inline static void operator delete(void* ptr) {
awesome::my_allocator<MyType,16> alloc;
alloc.deallocate(reinterpret_cast<MyType*>(ptr),0); //last arg ignored in my impl
}
inline static void operator delete[](void* ptr) { operator delete(ptr); }
अब, कैश-मोहल्ला कारणों के लिए, मैं 64-बाइट गठबंधन स्मृति के किसी विशेष भाग में एक उदाहरण कॉपी-निर्माण करने के लिए की जरूरत है:
error: no matching function for call to ‘MyType::operator new(sizetype, MyType*)’
आईसीसी मुझसे कहता है:
error : function "MyType::operator new" cannot be called with the given argument list
1> argument types are: (unsigned __int64, MyType *)
मैं यह समझ के रूप में, प्लेसमेंट नए ऑपरेटर सी ++ कार्यान्वयन द्वारा (<new>
, जो मैं भी #include
आईएनजी की कोशिश की? द्वारा या संभवतः) प्रदान की जाती है और केवल अपने तर्क देता है (new
स्मृति उपलब्ध, और प्लेसमेंट बनाता है नया प्रोग्रामर कह रहा है कि दी गई स्मृति उपलब्ध है)।
मजे की बात है, त्रुटि करता नहीं होते हैं, जब (साधारण!) नई ऊपर परिभाषित ऑपरेटरों कक्षा में नहीं हैं। दरअसल, MyOtherType
, जो उन्हें परिभाषित नहीं करता है, ठीक काम करता है।
प्रश्न: क्या चल रहा है? मुझे इसे कैसे ठीक करना चाहिए?
शायद 2 पैरा लेने के लिए नया अधिभार - ऑपरेटर नया (आकार, संरेखण) - ताकि सामान्य, 1 परम समाचार प्रभावित न हों। यह कंपाइलर को अंतर्निहित प्रकार का उपयोग करके शिकायत कर सकता है। फेंक बनाम नोट्रो ओवरलोडिंग कुछ मुद्दों के कारण भी हो सकता है। –
क्या यह एक अनुवाद इकाई में होता है? –
प्लेसमेंट नया आमतौर पर "ऑब्जेक्ट को पहले से आवंटित मेमोरी में रखने" के लिए प्रयोग किया जाता है, शायद आपको अपने कार्यान्वयन के साथ-साथ प्लेसमेंट नए ऑपरेटर को अधिभारित करने की आवश्यकता है? – AJG85