سؤال

هل هناك طريقة لفرض محاذاة حاوية STL إلى بايت محددة، باستخدام ينسب((محاذاة)) ربما؟ المحامرة المستهدفة ليست Microsoft Visual C ++.

ما هي المكتبات، إن وجدت، وتوفير قوالب متخصصة من خوارزميات STL التي لها فرضية صريحة محددة، مثل SSE. محمولات مصلحتي هي G ++، Intel، و IBM XL.

هل كانت مفيدة؟

المحلول

مع حاويات STL، يمكنك تقديم مصلح خاص بك عبر معلمة قالب اختياري. لن أوصي بكتابة مخصص كامل من الصفر، لكنك يمكن أن تكتب واحدة مجرد غلاف حولها new و delete ولكن يضمن أن الذاكرة التي تم إرجاعها تلبي متطلبات المحاذاة الخاصة بك. (على سبيل المثال، إذا كنت بحاجة n بايت مع محاذاة 16 بايت، أنت تستخدم new تخصيص n + 15 بايت وإرجاع مؤشر إلى أول عنوان محاذاة من 16 بايت في تلك الكتلة.)

ولكن قد يكون كافيا فقط لإضافة سمة المحاذاة إلى نوع العنصر. هذا خارج نطاق المعيار، لذلك يجب عليك التحقق من وثائق المحول البرمجي وإحاولة ذلك.

نصائح أخرى

تحتاج إلى مخصص مخصص مرت. يمكنك بناء واحدة على 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. وبعد إما أنك تحتاج إلى تطبيقها بنفسك (لا ينبغي أن تكون صعبة)، أو ابحث عن إصدارات من تلك الموجودة على الإنترنت (رأيت واحدا على الأقل غول محرك).

لقد حصلت بالفعل على بعض الإجابات الجيدة، ولكن يبدو أنها تستحق إضافة أن C ++ 0x يشمل std::align(), ، والتي يجب أن تجعل تنفيذ أشياء مثل هذا أسهل قليلا.

تحتاج إلى مخصص مخصص يعيد تخزين محاذاة. التي يجب أن تحل مشكلتك.

بدلا من كتابة المخصص الخاص بك، كما اقترح قبل, ، يمكنك استخدام boost::alignment::aligned_allocator.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top