2010-01-08 17 views
12

क्या विशेषता ((संरेखित) का उपयोग कर विशिष्ट बाइट को एसटीएल कंटेनर संरेखण को लागू करने का कोई तरीका है? लक्ष्य कंपाइलर माइक्रोसॉफ्ट विजुअल सी ++ नहीं हैं।सी ++ एसटीएल डेटा स्ट्रक्चर संरेखण, एल्गोरिदम वेक्टरराइजेशन

क्या पुस्तकालय, यदि कोई हैं, एसटीएल एल्गोरिदम के विशिष्ट टेम्पलेट प्रदान करते हैं जिनमें विशिष्ट स्पष्ट वेक्टरेशन होते हैं, उदा। SSE। रुचि के मेरे कंपाइलर्स जी ++, इंटेल और आईबीएम एक्सएल हैं।

उत्तर

12

एसटीएल कंटेनर के साथ, आप वैकल्पिक टेम्पलेट पैरामीटर के माध्यम से अपना स्वयं का आवंटन प्रदान कर सकते हैं। मैं स्क्रैच से एक संपूर्ण आवंटक लिखने की अनुशंसा नहीं करता, लेकिन आप new और delete के आस-पास एक रैपर ही लिख सकते हैं लेकिन यह सुनिश्चित करता है कि लौटाई गई स्मृति आपकी संरेखण आवश्यकता को पूरा करे। (उदाहरण के लिए, यदि आप 16-बाइट संरेखण के साथ n बाइट्स की जरूरत है, तो आप new का उपयोग n + 15 बाइट्स आवंटित और कहा कि ब्लॉक में पहले 16-बाइट गठबंधन का पता करने के लिए एक सूचक वापस जाने के लिए।)

लेकिन यह सिर्फ जोड़ने के लिए पर्याप्त हो सकता है तत्व प्रकार के लिए संरेखण विशेषता। यह मानक के दायरे से बाहर है, इसलिए आपको अपने कंपाइलर दस्तावेज़ों की जांच करनी होगी और इसे आजमाएं।

2

आपको एक कस्टम आवंटक की आवश्यकता है जो गठबंधन संग्रहण लौटाता है। यह आपकी समस्या को हल करना चाहिए।

7

आपको एक कस्टम आवंटन पास करने की आवश्यकता है। आप std::allocator काफी आसानी से खत्म हो गया एक बना सकते हैं:

template <typename T, size_t TALIGN=16, size_t TBLOCK=8> 
class aligned_allocator : public std::allocator<T> 
{ 
public: 
    aligned_allocator() {} 
    aligned_allocator& operator=(const aligned_allocator &rhs){ 
     std::allocator<T>::operator=(rhs); 
     return *this; 
    } 

    pointer allocate(size_type n, const void *hint){ 
     pointer p = NULL; 
     size_t count = sizeof(T) * n; 
     size_t count_left = count % TBLOCK; 
     if(count_left != 0) 
     { 
      count += TBLOCK - count_left; 
     } 
     if (!hint) 
     { 
      p = reinterpret_cast<pointer>(aligned_malloc(count,TALIGN)); 
     }else{ 
      p = reinterpret_cast<pointer>(aligned_realloc((void*)hint,count,TALIGN)); 
     } 
     return p; 
    } 

    void deallocate(pointer p, size_type n){ 
     aligned_free(p); 
    } 

    void construct(pointer p, const T &val){ 
     new(p) T(val); 
    } 

    void destroy(pointer p){ 
     p->~T(); 
    } 
}; 

केवल एक चीज यहां कमी aligned_malloc, aligned_realloc और aligned_free है। आपको या तो उन्हें स्वयं लागू करने की आवश्यकता है (यह कठिन नहीं होना चाहिए), या इंटरनेट पर उन लोगों के संस्करण ढूंढें (मैंने OGRE इंजन में कम से कम एक देखा है)।

+1

@ एनीकॉर्न, क्या आपने कभी इसे कार्यान्वित किया है? ऐसा लगता है कि कॉर्नेल किसिलेविज़ के उदाहरण को पूरा करना बहुत अच्छा होगा क्योंकि मुझे वास्तव में कहीं और ऑनलाइन इसका अच्छा उदाहरण नहीं दिख रहा है। –

3

आपको पहले से ही कुछ अच्छे उत्तर मिल चुके हैं, लेकिन ऐसा लगता है कि सी ++ 0x में std::align() शामिल है, जो इसे इस तरह की चीजों को कार्यान्वित करना चाहिए।

+1

क्या इसका उपयोग कहीं भी आवंटक के रूप में करने का एक उदाहरण है? –

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