何时使用std::size_t?

269

我只是想知道在循环和其他方面,我应该使用std::size_t还是int?例如:

#include <cstdint>

int main()
{
    for (std::size_t i = 0; i < 10; ++i) {
        // std::size_t OK here? Or should I use, say, unsigned int instead?
    }
}

一般来说,何时使用std::size_t是最佳实践?

15个回答

1

在循环中最好不要使用size_t。例如:

vector<int> a = {1,2,3,4};
for (size_t i=0; i<a.size(); i++) {
    std::cout << a[i] << std::endl;
}
size_t n = a.size();
for (size_t i=n-1; i>=0; i--) {
    std::cout << a[i] << std::endl;
}

第一个循环没有问题。但对于第二个循环:
当i=0时,i--的结果将会是ULLONG_MAX(假设size_t=unsigned long long),这在循环中不是你想要的。
此外,如果a为空,则n=0且n-1=ULLONG_MAX也不好。

0

我一直在努力理解何时以及如何使用它。但是,size_t只是一个无符号整数数据类型,定义在各种头文件中,例如<stddef.h>, <stdio.h>, <stdlib.h>, <string.h>, <time.h>, <wchar.h>等。

它用于表示对象的大小(以字节为单位),因此它被用作sizeof运算符的返回类型。最大允许的大小取决于编译器;如果编译器是32位,则它只是unsigned int的typedef(别名),但如果编译器是64位,则它将是unsigned long long的typedef。size_t数据类型永远不会是负数(不包括ssize_t)因此,许多C库函数(如malloc、memcpy和strlen)将其参数和返回类型声明为size_t

/ Declaration of various standard library functions.
  
// Here argument of 'n' refers to maximum blocks that can be
// allocated which is guaranteed to be non-negative.
void *malloc(size_t n);
  
// While copying 'n' bytes from 's2' to 's1'
// n must be non-negative integer.
void *memcpy(void *s1, void const *s2, size_t n);
  
// the size of any string or `std::vector<char> st;` will always be at least 0.
size_t strlen(char const *s);

size_t 或任何无符号类型可能被视为循环变量,因为循环变量通常大于或等于0。


1
你的回答全是关于C语言,但问题标记为C++。在C++中,我们不使用malloc/free,甚至new/delete在C++中都很少有有效的用途。对于动态内存管理,我们使用智能指针(如std::unique_ptr)代替(如果需要的话,因为通常可以使用标准容器(例如std::vector)完成常规工作)。另外,在C++中,我们不会 #include <stddef.h>#include <string.h>。相反,我们会使用#include <string>#include <cstddef>,并使用std::string。C和C++是不同的语言。 - heap underrun
抱歉,我真的没有注意到,谢谢。 - user15939950

0

size_t 是一种无符号类型,可以容纳您的体系结构的最大整数值,因此它受到由于符号(有符号整数 0x7FFFFFFF 加 1 将给您 -1)或短大小(无符号短整数 0xFFFF 加 1 将给您 0)引起的整数溢出的保护。

它主要用于数组索引/循环/地址算术等。像 memset() 等函数只接受 size_t,因为在理论上,您可能有一个大小为 2^32-1 (在 32 位平台上)的内存块。

对于这样简单的循环,请不要费心,只使用 int。


-3

size_t是一种无符号整数类型,可以表示您系统上的最大整数。只有在需要非常大的数组、矩阵等时才使用它。

一些函数返回一个size_t,如果您尝试进行比较,编译器会发出警告。

通过使用适当的有符号/无符号数据类型或简单地进行类型转换以进行快速处理来避免这种情况。


4
只有在想要避免漏洞和安全隐患时才使用它。 - Craig McQueen
2
它可能无法在您的系统上表示最大的整数。 - Adrian McCarthy

-5

size_t 是无符号整数。因此,每当您需要无符号整数时,都可以使用它。

我在想要指定数组大小、计数器等时使用它...

void * operator new (size_t size); is a good use of it.

10
实际上,它未必和unsigned int一样。虽然它是无符号的,但它可能比int更大(或者我猜可能更小,尽管我不知道有哪些平台满足这个条件)。 - Todd Gamblin
例如,在 64 位机器上,size_t 可能是一个无符号的 64 位整数,而在 32 位机器上它只是一个 32 位无符号整数。 - HerpDerpington

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接