size_t
- тип, который подходит для подсчета элементов в массиве и, следовательно, в любом контейнере на основе массива. Однако size_t
, концептуально, недостаточно для подсчета элементов в контейнере на основе не-массива. (Например, size_t
не может быть достаточно широким для подсчета элементов std::list
.) По этой причине в общем случае нецелесообразно использовать size_t
в качестве общего типа счетчика. И очевидным примером может служить сегментированная модель памяти, при которой size_t
может оказаться в конечном итоге относительно узкой по сравнению с пропускной способностью самой платформы.
Если вы действительно хотите найти общий тип, достаточно широкий для большинства случаев в реальной жизни, возможно, это будет uintptr_t
. И снова выбор в этом случае основан на том, что uintptr_t
должен быть достаточно широким, чтобы подсчитывать все, что может поместиться в память. Однако по очевидным причинам он может оказаться слишком маленьким, чтобы считать что-то более обширным.
Я также хотел бы добавить, что использование таких общих типов, как size_t
и unitptr_t
, поскольку счетчики в коде приложения могут рассматриваться как спорная практика программирования, поскольку они не передают семантику, специфичную для приложения. Они более ориентированы на память, чем общие-контр-ориентированные.
http://en.cppreference.com/w/cpp/types/size_t – Decipher
Возможный дубликат [unsigned int vs. size \ _t] (http://stackoverflow.com/questions/131803/unsigned-int- vs-size-t) –
Редактировать: Нежелательная идея для этой проблемы. В C++ 11 использовать авто и итераторы, чтобы избежать принятия этого решения во многих случаях. –