我只是想知道在循环和其他方面,我应该使用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
是最佳实践?
我只是想知道在循环和其他方面,我应该使用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
是最佳实践?
在循环中最好不要使用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;
}
我一直在努力理解何时以及如何使用它。但是,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。
size_t
是一种无符号类型,可以容纳您的体系结构的最大整数值,因此它受到由于符号(有符号整数 0x7FFFFFFF
加 1 将给您 -1)或短大小(无符号短整数 0xFFFF 加 1 将给您 0)引起的整数溢出的保护。
它主要用于数组索引/循环/地址算术等。像 memset()
等函数只接受 size_t
,因为在理论上,您可能有一个大小为 2^32-1
(在 32 位平台上)的内存块。
对于这样简单的循环,请不要费心,只使用 int。
size_t是一种无符号整数类型,可以表示您系统上的最大整数。只有在需要非常大的数组、矩阵等时才使用它。
一些函数返回一个size_t,如果您尝试进行比较,编译器会发出警告。
通过使用适当的有符号/无符号数据类型或简单地进行类型转换以进行快速处理来避免这种情况。
size_t 是无符号整数。因此,每当您需要无符号整数时,都可以使用它。
我在想要指定数组大小、计数器等时使用它...
void * operator new (size_t size); is a good use of it.
size_t
可能是一个无符号的 64 位整数,而在 32 位机器上它只是一个 32 位无符号整数。 - HerpDerpington
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