2014-09-23 4 views
1

Уместно ли использовать size_t вместо int или unsigned как тип для счетчика?Используйте `size_t` как тип для счетчика

Следующий код взято с C++ Primer.

size_t count_calls() 
{ 
    static size_t ctr = 0; 
    return ++ctr; 
} 

int main() 
{ 
    for (size_t i = 0; i != 10; ++i) 
     cout << count_calls() << endl; 
    return 0; 
} 

Я знаю, что size_t является хорошим выбором для размера, индексации массивов, но то, что о том, когда дело доходит до простого счетчика? (как в функции count_calls.) Есть ли разница?

+0

http://en.cppreference.com/w/cpp/types/size_t – Decipher

+2

Возможный дубликат [unsigned int vs. size \ _t] (http://stackoverflow.com/questions/131803/unsigned-int- vs-size-t) –

+0

Редактировать: Нежелательная идея для этой проблемы. В C++ 11 использовать авто и итераторы, чтобы избежать принятия этого решения во многих случаях. –

ответ

1

size_t - тип, который подходит для подсчета элементов в массиве и, следовательно, в любом контейнере на основе массива. Однако size_t, концептуально, недостаточно для подсчета элементов в контейнере на основе не-массива. (Например, size_t не может быть достаточно широким для подсчета элементов std::list.) По этой причине в общем случае нецелесообразно использовать size_t в качестве общего типа счетчика. И очевидным примером может служить сегментированная модель памяти, при которой size_t может оказаться в конечном итоге относительно узкой по сравнению с пропускной способностью самой платформы.

Если вы действительно хотите найти общий тип, достаточно широкий для большинства случаев в реальной жизни, возможно, это будет uintptr_t. И снова выбор в этом случае основан на том, что uintptr_t должен быть достаточно широким, чтобы подсчитывать все, что может поместиться в память. Однако по очевидным причинам он может оказаться слишком маленьким, чтобы считать что-то более обширным.

Я также хотел бы добавить, что использование таких общих типов, как size_t и unitptr_t, поскольку счетчики в коде приложения могут рассматриваться как спорная практика программирования, поскольку они не передают семантику, специфичную для приложения. Они более ориентированы на память, чем общие-контр-ориентированные.

Смежные вопросы