在C++中使用size_t是一种好习惯吗?

Fra*_*ank 13 c++ types

我看到人们size_t只要意味着无符号整数就会使用.例如:

class Company {
  size_t num_employees_;
  // ...
};
Run Code Online (Sandbox Code Playgroud)

那是好习惯吗?有一点是你必须包括<cstddef>.应该是unsigned int吗?甚至只是int

只是使用int对我有吸引力的声音,因为它避免了像这样的愚蠢错误(因为人们经常使用int):

for(int i = num_employees_ - 1; i >= 0; --i) {
   // do something with employee_[i]
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ung 14

size_t可能有不同的大小int.

对于像员工数量等这样的事情,这种差异通常是无关紧要的; 一个人有多少2 ^ 32名员工?但是,如果您是一个表示文件大小的字段,那么如果您的文件系统支持64位文件,则需要使用size_t而不是int.

要意识到对象大小(由获得的sizeof)是类型size_t,而不是intunsigned int; 相应地,ptrdiff_t对于两个指针(例如,&a[5] - &a[0] == ptrdiff_t(5))之间存在差异.

  • 您应该将off_t用于filesizes,而不是size_t.在32位系统上,size_t将为32位,而off_t将为64位(假设支持大文件). (14认同)

Ger*_*ald 7

在许多情况下使用size_t有助于实现可移植性.size_t并不总是"unsigned int",但它始终是可以表示给定平台上最大可能对象的大小.例如,某些平台具有16位整数大小,但使用32位指针.在这种情况下,如果你使用unsigned int作为某些东西的大小,你将它限制为65,536字节(或其他元素),即使平台可以处理更大的东西.

在您的示例中,我可能会使用typedef表示32位或64位无符号整数,而不是使用int或unsigned int或size_t.


rpg*_*rpg 7

在你的情况下,不要使用它们中的任何一个.使用容器和迭代器或创建提供迭代器/范围访问的新数据类型(例如,员工数据库).

至于未签名,Bjarne Stroustrup在TCPL中写道:

无符号整数类型非常适合将存储视为位数组的用途.使用无符号而不是int来再获得一位来表示正整数几乎不是一个好主意.通过声明无符号变量来确保某些值为正的尝试通常会被隐式转换规则所取代.