2010-02-26 96 views
6

有没有办法posix_memalign一个std :: vector而不先创建一个向量的本地实例? 我现在遇到的问题是,我需要告诉posix_memalign多少空间分配,我不知道怎么说posix_memalign for std :: vector

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

,而不实际创建一个新的载体。

谢谢

回答

9

那么,这里有两种尺寸。 vector本身通常不过是指向一些分配内存的指针或两个指针,而无符号整数跟踪大小和容量。还有分配的内存本身,这是我认为你想要的。

你想要做的是做一个自定义的分配器,vector将使用。当它到了时候,它会使用你的分配器,你可以拥有自己的特殊功能。我不会去了一个分配器的full details,但具体细节:

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); 
    } 

    // ... 
}; 

然后你会使用它像:

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

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

但重申第一点,的大小不管有多少元素,它都是一样的,因为它只指向一个缓冲区。只有该缓冲区的大小发生变化。