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