C++ 在C+中使用size#t是一种良好的做法吗+;?

C++ 在C+中使用size#t是一种良好的做法吗+;?,c++,types,C++,Types,我见过人们在表示无符号整数时使用size\t。例如: class Company { size_t num_employees_; // ... }; 这是好的做法吗?一件事是你必须包括。是否应该改为无符号int?甚至只是int 仅仅使用int听起来很吸引我,因为它可以避免像这样愚蠢的错误(因为人们经常使用int): size\u t可能与int的大小不同 对于员工数量等方面,这种差异通常是无关紧要的;员工超过2^32人的频率是多少?但是,如果您需要一个字段来表示文件大小,那么如果文件

我见过人们在表示无符号整数时使用
size\t
。例如:

class Company {
  size_t num_employees_;
  // ...
};
这是好的做法吗?一件事是你必须包括
。是否应该改为
无符号int
?甚至只是
int

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


size\u t
可能与
int
的大小不同

对于员工数量等方面,这种差异通常是无关紧要的;员工超过2^32人的频率是多少?但是,如果您需要一个字段来表示文件大小,那么如果文件系统支持64位文件,您将希望使用
size\u t
而不是
int


务必意识到对象大小(通过
sizeof
获得)属于
size\u t
类型,而不是
int
无符号int
;同样,相应地,对于两个指针之间的差异有一个
ptrdiff_t
(例如,
&a[5]-&a[0]==ptrdiff_t(5)
)。

在这种情况下,我将使用
无符号int
int
size\u t
似乎主要用于表示数据结构的大小。从概念上讲,虽然员工数量在某些情况下可能是数据结构的大小,但不一定如此;这可能只是一个计数。所以我会使用
int
,但我可能不会太过强调这一点。

我不是专业人士,但我只使用
size\u t
作为内存大小,以提高代码的可读性。在其他任何情况下,我都使用
无符号int
(或其他任何形式)。

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


在您的示例中,我可能会对32位或64位无符号整数使用typedef,而不是使用int或unsigned int或size\u t。

在这种情况下,您不希望使用纯int,因为员工人数永远不会为负数,您希望您的编译器帮助您执行此规则,对吗?

您始终可以使用以下内容:

employeeList.size();


我的意思是,除非只是一些内部计算或算法,否则不要包含int和其他类似的类型

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

至于未签名,比亚恩·斯特劳斯图普在TCPL中写道:

无符号整数类型非常适合处理存储的使用 作为位数组。使用无符号而不是整数来获得 再多一位表示正整数几乎从来都不是一个好主意 主意试图通过声明 无符号变量通常会被隐式 转换规则


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

为此,您应该只使用size\u t,其他情况下,您应该使用int或定义自己的类型


参见.< /P> < P>我认为,使用代码< > SIEZYT不仅对内存区域的大小,而且对于索引(如 < <代码> >循环中的索引变量),并不是一个坏的C++风格,因为在C++引用中我们可以看到如下:

(此示例来自标准的
unique_ptr
template类。)


因此,标准运算符用于索引数组元素,它的参数类型正好是
size\u t

,如果我得到编译器或运行时警告,我会很高兴:num\u employees\u=0--员工人数;但这不会发生。@dehmann,但您可以编写以无符号int为参数的函数/方法,当用户传递纯int时,他们会收到警告。@Piotr:不会的。“voidfoo(unsignedinta){}intmain(){inta=-1;foo(a);}”不会在我所知道的任何编译器上发出警告。传递一个负的文本就可以了。检查这个线程:我不知道有谁会从大小向下计算到0:|我很好奇关于演员的答案。如果使用unsigned int或int,而这不是系统上实际的大小,那么它可能必须转换它,因此可能会影响性能?这可能很有用,但按照示例所示的方式执行是不好的做法。选择数据类型以满足一个坏习惯会导致两个坏习惯。@GMan:好吧,如果有一个函数返回项数,那么倒数将非常有用:for(int i=getNum()-1;i>=0;--i),因为如果只是倒数,那么该函数将被多次调用(潜在的性能问题).在这种经济环境下,你经常把员工数降到零。听说过“后进先出”吗?你应该用off\t表示文件大小,而不是大小。在32位系统上,大小为32位,而off为64位(假设支持大文件)。@Søren:+1非常好的观点。我将尝试想想另一个例子,其中有一个64位的
size\u t
,然后更新我的帖子。欢迎您提出任何建议。:-)
employeeList.size();
EmployeeList::size_type i = 0;
EmployeeNumber number = employee.getNumber();
T& operator[](size_t i) const;