2010-02-26 41 views
6

Có cách nào để posix_memalign một std :: vector mà không tạo ra một thể hiện cục bộ của véc tơ đầu tiên? Vấn đề tôi đang gặp phải là tôi cần phải nói với posix_memalign bao nhiêu không gian để bố trí và tôi không biết làm thế nào để nóiposix_memalign cho std :: vector

sizeof(std::vector<type>(n)) 

mà không thực sự tạo ra một vector mới.

Cảm ơn

Trả lời

9

Vâng, có hai kích thước tại đây. Bản thân số vector thường không nhiều hơn một hoặc hai con trỏ tới một số bộ nhớ được phân bổ và các số nguyên không dấu theo dõi kích thước và dung lượng. Ngoài ra còn có bộ nhớ được phân bổ chính nó, đó là những gì tôi nghĩ rằng bạn muốn.

Những gì bạn muốn làm là tạo một trình phân bổ tùy chỉnh mà vector sẽ sử dụng. Khi nó đến thời gian, nó sẽ sử dụng cấp phát của bạn và bạn có thể có chức năng đặc biệt của riêng bạn. Tôi sẽ không đi qua full details của một cấp, nhưng các chi tiết cụ thể:

template <typename T> 
struct aligned_allocator 
{ 
    // ... 

    pointer allocate(size_type pCount, const_pointer = 0) 
    { 
     pointer mem = 0; 
     if (posix_memalign(&mem, YourAlignment, sizeof(T) * pCount) != 0) 
     { 
      throw std::bad_alloc(); // or something 
     } 

     return mem; 
    } 

    void deallocate(pointer pPtr, size_type) 
    { 
     free(pPtr); 
    } 

    // ... 
}; 

Và sau đó bạn muốn sử dụng nó như:

typedef std::vector<T, aligned_allocator<T> > aligned_T_vector; 

aligned_T_vector vec; 
vec.push_back(/* ... */); // array is aligned 

Nhưng để nhắc lại điểm đầu tiên, kích thước của một vector là giống nhau bất kể có bao nhiêu phần tử mà nó đang nắm giữ, vì nó chỉ trỏ đến bộ đệm. Chỉ kích thước của bộ đệm đó thay đổi.

Các vấn đề liên quan