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.