任何人都可以解释为什么size_t类型与一个例子一起使用?

时间:2012-03-10 23:33:29

标签: c++ c

我想知道为什么在我可以使用say int type的地方使用size_t。它说size_tsizeof运算符的返回类型。这是什么意思?就像我使用sizeof(int)并存储它返回int类型变量的内容一样,它也可以工作,没有必要将它存储在size_t类型变量中。我只是清楚地想要了解使用size_t的基本概念以及一个清晰易懂的例子。谢谢

7 个答案:

答案 0 :(得分:10)

size_t保证能够代表可能的最大尺寸,int不是。这意味着size_t更具便携性。

例如,如果int最多只能存储255但你可以分配5000字节的数组呢?显然,这不起作用,但size_t会这样。

答案 1 :(得分:4)

最简单的例子非常过时:在一个64位RAM的旧16位 - int系统上,int的值可以是-32768到+32767之间的任何值,但之后:

char buf[40960];

缓冲区buf占用40千字节,因此sizeof buf太大而无法容纳int,而且需要unsigned int

如果您使用32位int,但是允许程序一次访问超过4 GB的RAM,就会发生同样的事情,就像所谓的“I32LP64”型号(32位)一样int,64位long和指针)。此处类型size_t的范围与unsigned long相同。

答案 2 :(得分:1)

您主要使用size_t将指针转换为相同大小的无符号整数,以对指针执行计算,就好像它们是整数一样,否则在编译时会被阻止。这样的代码旨在在不同指针大小的上下文中正确地编译和构建,例如, 32位模型与64位模型。

答案 3 :(得分:0)

它是实现定义的,但在64位系统上,您会发现size_t通常是64位,而int仍然是32位(除非它是ILP64 or SILP64型号)。

答案 4 :(得分:0)

取决于您所使用的架构(16位,32位或64位),int可以是不同的大小。

如果你想要一个特定的大小我使用uint16_t或uint32_t ....你可以查看这个帖子以获取更多信息

What does the C++ standard state the size of int, long type to be?

答案 5 :(得分:0)

size_t 是为存储对象大小而定义的typedef。它可以存储目标平台支持的最大对象大小。这使它便携。

例如:

void * memcpy(void * destination, const void * source, size_t num);

memcpy() num 个字节从源复制到目标。可以复制的最大字节数取决于平台。因此,将 num 作为 size_t 类型使 memcpy 可移植。

有关详细信息,请参阅https://stackoverflow.com/a/7706240/2820412

答案 6 :(得分:0)

  1. size_t是基本无符号整数类型之一的typedef。根据实现的不同,它可以是unsigned int,unsigned long或unsigned long long。
  2. 它的特殊属性是它可以表示任何对象(也包括最大的对象!)的大小(以字节为单位)。这是它在标准库中广泛用于数组索引和循环计数的原因之一(这也解决了可移植性问题)。让我用一个简单的例子来说明这一点。

考虑一个长度为2 * UINT_MAX的向量,其中UINT_MAX表示无符号int的最大值(对于我的实现,考虑到无符号int为4个字节,则为4294967295)。

  

std :: vector vec(2 * UINT_MAX,0);

如果要使用这样的for循环填充向量,则它将无法正常工作,因为unsigned int只能迭代到UINT_MAX点(超过该点它将再次从0开始)。

  

for(unsigned int i = 0; i <2 * UINT_MAX; ++ i)vec [i] = i;

这里的解决方案是使用size_t,因为可以保证以字节为单位表示任何对象的大小(因此也可以表示矢量vec!)。请注意,对于我的实现,size_t是无符号long的typedef,因此考虑到8个字节,其最大值= ULONG_MAX = 18446744073709551615。

  

for(size_t i = 0; i <2 * UINT_MAX; ++ i)vec [i] = i;

参考:https://en.cppreference.com/w/cpp/types/size_t