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

时间:2009-07-11 16:09:01

标签: c++ types

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

class Company {
  size_t num_employees_;
  // ...
};

这是好习惯吗?有一点是你必须包括<cstddef>。它应该是unsigned int吗?或者甚至只是int

使用int听起来对我很有吸引力,因为它避免了像这样的愚蠢错误(因为人们经常使用int):

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

9 个答案:

答案 0 :(得分:14)

size_t可能与int的大小不同。

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:7)

在您的情况下,请勿使用其中任何一种。使用容器和迭代器或创建一个提供迭代器/范围访问的新数据类型(例如员工数据库)。

至于无符号,Bjarne Stroustrup在TCPL中写道:

  

无符号整数类型非常适合处理存储的用途       作为一个位数组。使用无符号而不是int来获得       再多一点代表正整数几乎从来都不是一件好事       理念。尝试通过声明确保某些值是正数       无符号变量通常会被隐式变为失败       转换规则。

答案 3 :(得分:2)

你总是可以使用像

这样的东西
employeeList.size();

EmployeeList::size_type i = 0;

EmployeeNumber number = employee.getNumber();

我的意思是包含int和其他类型的int,除非它只是一些内部计算或算法。

答案 4 :(得分:1)

size_t专门用于指定值的内存大小(以字节为单位)。它是sizeof表达式的类型。

你应该只为此目的使用size_t,对于你应该使用int的其他东西或定义你自己的类型。

另见Wikipedia

答案 5 :(得分:0)

在这种情况下,我会使用unsigned intintsize_t似乎主要用于表示数据结构的大小。从概念上讲,虽然员工人数在某些情况下可能是数据结构的大小,但并不一定;它可能只是一个计数。所以我会使用int,但我可能不会过分强调这一点。

答案 6 :(得分:0)

我不是专业人士,但我只使用size_t作为内存大小来提高代码的可读性。在其他每种情况下,我都使用unsigned int(或其他任何东西)。

答案 7 :(得分:0)

我想说,[BindProperty] public string Product_Name{ get; set; } 不仅用于内存区域的大小,而且还用于索引(例如size_t循环中的索引变量),一定不是坏C ++风格,因为在C ++参考中,我们看到definitions像这样:

for

(此示例来自标准T& operator[](size_t i) const; 模板类。)

因此,标准运算符旨在用于索引数组的元素,并且其参数的类型恰好是unique_ptr

答案 8 :(得分:-1)

在这种情况下,您不希望使用plain int,因为员工数量从不为负,您希望编译器帮助您实施此规则,对吗?