size_t vs C ++和/或C中的int

时间:2009-06-15 02:12:59

标签: c++ c size-type

为什么在C ++容器中,它返回size_type而不是int?如果我们正在创建自己的结构,我们是否也应该鼓励使用size_type

9 个答案:

答案 0 :(得分:26)

通常,只要您测量某物的大小,就应该使用size_t。奇怪的是,size_t只需要表示0到SIZE_MAX个字节,而SIZE_MAX只需要65,535 ...

C ++和C标准的其他有趣限制是:

  • sizeof()的返回类型为size_t,它是无符号整数
  • operator new()将要分配的字节数作为size_t参数
  • size_t<cstddef>
  • 中定义
  • SIZE_MAX在C99的<limits.h>中定义,但在C ++ 98中没有提及?!
  • size_t未包含在基本整数类型列表中,因此我一直认为size_t是其中一种基本类型的类型别名:{{1 },charshort intint

如果要计算字节数,那么你肯定应该使用long int。如果你在计算元素的数量,那么你应该使用size_t,因为这似乎是C ++一直在使用的。在任何情况下,您都不想使用size_t - 如果您使用TR1,则至少使用intunsigned long。或者......更好...... unsigned long long无论您最终使用typedef还是仅包含size_type并使用<cstddef>

答案 1 :(得分:9)

可能有以下几个原因:

  • 类型(size_t)可以定义为该平台上最大的无符号整数。例如,它可能被定义为32位整数或64位整数或其他能够存储长度无符号值的其他东西
  • 在阅读程序时明确表示该值是一个大小而不仅仅是“常规”int

如果您正在编写一个仅适合您和/或一次性使用的应用程序,那么使用基本的int可能很好。如果你正在编写一个库或一些实质性的东西,size_t可能是一个更好的方法。

答案 2 :(得分:5)

有些答案比必要的要复杂得多。 size_t是无符号整数类型,保证大到足以存储内存中任何对象的字节大小。实际上,它总是与指针类型相同。在32位系统上,它是32位。在64位系统上,它是64位。

答案 3 :(得分:2)

stl中的所有容器都有各种typedef。例如,value_type是元素类型,size_type是数字存储类型。通过这种方式,容器基于平台和实现是完全通用的。

如果您要创建自己的容器,也应该使用size_type。通常这样做

typedef std::size_t size_type;

如果你想要一个容器的大小,你应该写

typedef vector<int> ints;
ints v;
v.push_back(4);
ints::size_type s = v.size();

如果以后要使用列表,只需将typedef更改为

即可
typedef list<int> ints;

它仍然可以使用!

答案 4 :(得分:1)

我假设你的意思是“size_t” - 这是一种表示无符号整数的方法(一个只能是正整数,从不为负数的整数) - 它对容器的大小有意义,因为你不能有一个数组大小为-7。我不会说你必须使用size_t,但它确实向其他人使用你的代码表明“这里的数字总是正面的。”它还为您提供了更大范围的正数,但除非您有一些非常大的容器,否则这可能并不重要。

答案 5 :(得分:1)

C ++是一种可以在不同硬件架构和平台上实现的语言。随着时间的推移,它已经支持16位,32位和64位架构,并且可能在将来支持其他架构。 size_type和其他类型别名是库将程序员/代码与实现细节隔离的方法。

假设size_type在32位计算机上使用32位而在64位计算机上使用64位,如果您在需要时使用了size_type,则相同的源代码可能会更好。在大多数情况下,您可以假设它与unsigned int相同,但不能保证。

size_type用于表示STL容器的容量,如std::vector,而size_t用于表示C / C ++中对象的字节大小。

答案 6 :(得分:0)

ints不保证在规范中是4个字节,因此它们不可靠。是的,size_type比首选

更受欢迎

答案 7 :(得分:0)

size_t是无符号的,所以即使它们都是32位,它也不代表与非限定int完全相同的东西。我不确定为什么他们添加了类型,但在今天的许多平台sizeof (size_t) == sizeof (int) == sizeof (long)上,您选择哪种类型取决于您。请注意,这些关系不受标准保证,并且随着64位平台的推移而迅速变得过时。

对于您自己的代码,如果您需要在概念上代表某个“大小”且永远不会消极的内容,size_t将是一个不错的选择。

答案 8 :(得分:-5)

void f1(size_t n) {
    if (n <= myVector.size()) { assert(false); }
    size_t n1 = n - myVector.size(); // bug! myVector.size() can be > n       
    do_stuff_n_times(n1);
}

void f2(int n) {
    int n1 = n - static_cast<int>(myVector.size());
    assert(n1 >= 0);
    do_stuff_n_times(n1);
}

f1()和f2()都有相同的错误,但检测f2()中的问题更容易。对于更复杂的代码,无符号整数算术错误并不容易识别。

我个人使用signed int来表示我的所有大小,除非使用unsigned int。我从来没有碰到我的大小不适合32位有符号整数的情况。在使用无符号32位整数之前,我可能会使用64位有符号整数。

在代码中使用有符号整数的大小问题是static_castsize_t的很多int