मैं हाल ही में इस प्रश्न पूछा:एक uint8_t सरणी कैसे बनाएं जो सख्त एलियासिंग को कमजोर न करे?
Using this pointer causes strange deoptimization in hot loop
समस्या यह है कि मैं प्रकार uint8_t
की एक सरणी के लिए लिख रहा था और संकलक यह है कि यह विधि का this
सूचक के साथ उर्फ सकता है (के प्रकार का इलाज किया था struct T*
), क्योंकि void*
और char*
(= uint8_t*
) हमेशा C++ में किसी भी अन्य सूचक को उपनाम कर सकते हैं। इस व्यवहार ने एक मिस्ड ऑप्टिमाइज़ेशन अवसर का कारण बना दिया। मैं निश्चित रूप से इससे बचना चाहता हूं। तो सवाल यह है: क्या मैं uint8_t
सरणी घोषित कर सकता हूं जो सख्त एलियासिंग को लागू करता है, यानी, कि कंपाइलर किसी अन्य प्रकार के किसी भी सूचक के साथ कभी भी अलियाकृत नहीं होता है? यानी, मैं strict_uint8_t
प्रकार की तरह कुछ ढूंढ रहा हूं जो विशेष अलियासिंग व्यवहार के साथ uint8_t
है। क्या इसको हासिल करने के लिए कोई रास्ता है?
उदाहरण कोड यह दिखाने के लिए कि मेरा क्या मतलब है, अन्य प्रश्न और सरलीकृत से उधार लिया गया है।
enum strict_uint8_t : uint8_t {};
आप को बदलने में सक्षम होना चाहते हैं और:
struct T{
uint8_t* target;
void unpack3bit(char* source, int size) {
while(size > 0){
uint64_t t = *reinterpret_cast<uint64_t*>(source);
/** `this->target` cannot be cached in a register here but has
to be reloaded 16 times because the compiler
thinks that `this->target` could alias with `this` itself.
What I want is a special uint8_t type that does not trigger
this behaviour. */
this->target[0] = t & 0x7;
this->target[1] = (t >> 3) & 0x7;
this->target[2] = (t >> 6) & 0x7;
this->target[3] = (t >> 9) & 0x7;
this->target[4] = (t >> 12) & 0x7;
this->target[5] = (t >> 15) & 0x7;
this->target[6] = (t >> 18) & 0x7;
this->target[7] = (t >> 21) & 0x7;
this->target[8] = (t >> 24) & 0x7;
this->target[9] = (t >> 27) & 0x7;
this->target[10] = (t >> 30) & 0x7;
this->target[11] = (t >> 33) & 0x7;
this->target[12] = (t >> 36) & 0x7;
this->target[13] = (t >> 39) & 0x7;
this->target[14] = (t >> 42) & 0x7;
this->target[15] = (t >> 45) & 0x7;
source+=6;
size-=6;
target+=16;
}
}
};
क्या आप वाकई 'लक्ष्य + = 16' क्या करना चाहते हैं जी ++ के मामले में? फिर आप मूल टी :: लक्ष्य' सूचक खो देंगे। –
मुझे यह मानना है कि मुझे समझ में नहीं आता कि 'इस' (किसी भी अन्य चर के बजाय) के साथ अलियासिंग क्या करता है। मुझे यह भी यकीन नहीं है कि यह प्रासंगिक है या नहीं। वैसे भी निश्चित रूप से एक दिलचस्प सवाल है। –
@ जोचिम पिलेबोर्ग: हाँ, यह ठीक है। "लक्ष्य लिखने के सिर" सूचक के रूप में 'लक्ष्य' के बारे में सोचें। 'लक्ष्य' बफर की शुरुआत कहीं और संग्रहीत की जाती है। इसके अलावा, यह कोड सिर्फ समस्या दिखाने के लिए है :)। – gexicide