Забавный вопрос.
Итак, что же случилось?Хорошо, если вы выполните отладку с помощью gdb, вы увидите что-то вроде трех переменных-членов (имена не точны):
_M_begin
: указатель на первый элемент динамического массива _M_end
: указатель один за последним элементом динамического массива _M_capacity
: указатель один за последним элементом, который может быть сохранен в динамическом массиве
РеализацияТаким образом, значение vector<T,Alloc>::size()
обычно сокращается до:
return _M_end - _M_begin; // Note: _Mylast - _Myfirst in VC 2008
Теперь, когда речь идет о возможной оптимизации, необходимо учитывать два момента:
- будет ли эта функция встроенной?Вероятно: я не пишу компилятор, но это хорошая ставка, так как накладные расходы на вызов функции приведут к уменьшению фактического времени здесь, и так как это шаблонно, у нас будет весь код, доступный в модуле перевода
- , результатом будеткэшируется (т. е. вроде имеет неназванную локальную переменную): вполне может быть, но вы не узнаете, если не разберете сгенерированный код* Если вы храните
size
самостоятельно, есть большая вероятность, что он будет настолько же быстрым, как компилятор может его получить ... - , но вы подвергаетесь техническому разрушению: что, если вы вдруг измените вектори не обновлять переменную;)?
Во всяком случае, я серьезно сомневаюсь, что это стоит хлопот.В лучшем случае это микрооптимизация, которая вряд ли принесет значительные улучшения.