2013-03-24 3 views
6

नए सी ++ 11 संरेखण उपकरण का उपयोग करके मैं यह सुनिश्चित करना चाहता था कि एक कैश लाइन में अस्थायी (स्टैक) चर का एक सेट झूठ बोले। मेरा पहला निष्पक्ष प्रयास निम्नानुसार था:कैश-गठबंधन स्टैक चर

int main() { 
    alignas(64) int a; // 0x7fffc58aac80, properly aligned at 64 
    int b; // 0x7fffc58aac7c 
    int c; // 0x7fffc58aac78 
    return 0; 
} 

मुझे बेवकूफ़ बनाओ! स्टैक इस तरह चर को आवंटित नहीं करता है, इस प्रकार ab और c से अलग कैश लाइन पर होगा।

क्या इसका मतलब यह है कि कई चरों को सही ढंग से संरेखित करने का एकमात्र तरीका कुल के माध्यम से है?

struct alignas(64) Abc { 
    int x; 
    int y; 
    int z; 
}; 

int main() { 
    Abc foo; 
    // x 0x7fff40c2d3c0 (aligned at 64) 
    // y 0x7fff40c2d3c4 
    // z 0x7fff40c2d3c8 
    return 0; 
} 

संकलक: बजना 3.2

+8

क्या आप वास्तव में सोचते हैं कि एक ही कैश लाइन में इन सभी चरों को प्रदर्शन में सुधार करने जा रहा है? बाधाएं बहुत अच्छी हैं कि ढेर कैश में है। –

+0

यह * प्रभाव हो सकता है यदि इन चरों को एकाधिक कोरों के बीच साझा करने की आवश्यकता है, जैसे कि जो भी कोर इन्हें लिखना चाहता है, उसे एक समय में सभी तीन चर का उपयोग करने की आवश्यकता है। यदि वे सभी एक ही कैश लाइन में हैं और इन चरों तक पहुंच दुर्लभ हैं, तो सहारे यातायात कम हो जाएगा। हालांकि इस बात की कोई गारंटी नहीं है कि लाइन को उसी पंक्ति में दो चर पढ़ने के बीच अमान्य किया जा सकता है। –

+1

आधुनिक संकलन एक निश्चित स्थान पर स्टैक वैरिएबल भी नहीं रखते हैं (जब तक आप अपना पता नहीं लेते)। इसलिए यदि 'ए' और' बी 'ने कैश लाइन साझा की है, तो किसी एक को लिखने के बाद जो बदल सकता है। (यह स्टेटिक सिंगल असाइनमेंट इष्टतमरण के लिए विशिष्ट है) – MSalters

उत्तर

4

ठीक से, कई चर आप एक समग्र का उपयोग करना चाहिए संरेखित करने के लिए क्योंकि स्वत: चर के लिए लेआउट परिभाषित नहीं है। मुझे सी ++ 11 मानक में कुछ भी नहीं मिल रहा है जो कहता है कि स्वचालित स्टोरेज वाले चर को उसी क्रम में स्टैक पर आवंटित किया जाना चाहिए जिसे वे परिभाषित करते हैं। मानक की धारा 5.9 जोर देती है कि केवल कुछ प्रकार की सूचक तुलना परिभाषित की जाती है, और स्वचालित भंडारण वाले चर के बीच तुलना परिभाषित के रूप में सूचीबद्ध नहीं है।

संबंधित मुद्दे