2012-04-14 1 views
1

У меня вопрос о реализации вектора в EASTL. Ссылка есть here.EASTL векторный дизайн по размеру() метод

А именно, по методу size(). Вот как это выглядит:

template <typename T, typename Allocator> 
inline typename vector<T, Allocator>::size_type 
vector<T, Allocator>::size() const 
{ 
    return (size_type)(mpEnd - mpBegin); 
} 

size_type является uint32_t, mpBegin/mpEnd являются Т * указатели.

Я не понимаю, как отливка до uint32_t из (mpEnd - mpBegin) равна номер элементов в векторе. Разве это не должно быть разделено на sizeof(T)? В противном случае мы просто получаем размер в байтах всех элементов вектора?

Что мне не хватает?

EDIT: Если вектор EASTL не dosn't следовать СТЛ дефиниция вектора, но я не мог найти какие-либо данные о нем и его якобы можно заменить СТЛ вектор с eastl вектор

ответ

2

Это не приведение, которое заставляет операцию равняться количеству элементов в массиве. Вычитание указателя уже делает правильные вещи здесь. Когда вы вычитаете один указатель из другого, учитывается размер типов, на которые они указывают. Нет необходимости делиться на sizeof(T). Это всегда было так, даже в C. Приведение просто преобразует его в правый целочисленный тип для возвращаемого значения, если оно еще не было.

+0

ohhh Я вижу, это имеет смысл, спасибо – KaiserJohaan

1

Размер только в байтах, если вы используете char* или, возможно, void*. Кроме того, он находится в sizeof(T). С mpEnd и mpBegin являются T*.

+0

'void *' не разрешает арифметику указателя. И даже с символом 'char *' он все еще находится в единицах 'sizeof (T)', который, как оказалось, равен 1. –