某些系统库(如malloc strlen)需要或返回size_t作为参数.
我是一名电气工程师,他转向计算机科学家.我很难理解为什么在C++中有这么多东西几乎相同但不完全相同.一个例子是shortVS intVS unsigned intVS size_tVS long intVS long long intVS uint8_t(我不知道是否有指定的整数任何其他方式).它似乎使语言不必要地变得复杂.
可能或应该size_t被替换或者是否有任何功能无法以其他方式使用?
[编辑]
在有用的答案之后,还有一些我还没有完全看到的东西.size_t一些人建议,在便携性和性能方面很有用.但是有多大帮助,是否有一种定量方法或数字证据来衡量优势而不仅仅是让int所有兄弟退休?
该文档说,size_type的std::vector是/ usually / size_t,这是合理的,因为实现可以选择使用不同的东西。
但是为什么size_type = size_t在std::array。特别是在这里,因为std::array使用很少µC,所以最好使实现具有一定的自由度。
这是文档缺陷吗?
据我所知,size_t和wchar_t的表示完全是特定于平台/编译器的.例如,我已经读过Linux上的wchar_t现在通常是32位,但在Windows上它是16位.有没有什么方法可以在我自己的代码中将这些标准化为一组大小(int,long等),同时仍然保持与两个平台上现有标准C库和函数的向后可比性?
我的目标基本上是做类似的设置,因此它们是一组尺寸.这可能不会破坏某些东西吗?我应该这样做吗?有没有更好的办法?
更新:我想这样做的原因是我的字符串编码在Windows和Linux上都是一致的
谢谢!
我正在用 C 创建一个哈希表的实现,用于教育目的。
哈希函数应返回 size_t 哈希值。由于size_t的大小在不同的平台上是不同的(并且我想使用散列函数来对size_t中的所有位进行散列),所以我想到为不同的大小创建不同的散列函数。由于哈希函数将用作函数指针,我怀疑编译器无法像这样内联代码:
size_t hash4(void* key, size_t size);
size_t hash8(void* key, size_t size);
size_t hash(void* key, size_t size)
{
if (sizeof(size_t) == 4)
{
return hash4(key, size);
}
else if (sizeof(size_t) == 8)
{
return hash8(ket, size);
}
}
size_t (*hashFunc)(void* key, size_t size) = hash;
Run Code Online (Sandbox Code Playgroud)
每次调用哈希函数时都会使用两级间接。
这就是为什么我想到做这样的事情:size_t (*hashFunc)(void* key, size_t size) = hash##sizeof(size_t);相反。将仅使用一级间接。问题是 sizeof 运算符在前置阶段不可用。
那么定义一个预处理器值的好方法是什么,该值将在每个平台上扩展为正确的 size_t 大小?我想我可以检查预定义的宏,但我想知道是否有更好的方法。
当我遇到这个例子时,我正在阅读一篇关于这里的使用size_t和ptrdiff_t数据类型的文章:

代码:
int A = -2;
unsigned B = 1;
int array[5] = { 1, 2, 3, 4, 5 };
int *ptr = array + 3;
ptr = ptr + (A + B); //Error
printf("%i\n", *ptr);
Run Code Online (Sandbox Code Playgroud)
我无法理解一些事情.首先,如何添加一个signed和一个unsigned数字将输入结果转换为unsigned类型?如果结果确实0xFFFFFFFF是unsigned类型,为什么在32位系统中,在添加它时ptr,是否会被解释为ptr-1,假设数字实际是unsigned类型而前导1不应该表示符号?
第二,为什么64位系统的结果不同?
有人能解释一下吗?
我的理解size_t是它足够大以容纳你可能期望它保持的任何(整数)值.(也许这是一个糟糕的解释?)
例如,如果你使用像for循环这样的东西迭代向量中的所有元素,size_t通常会是64位长(或者至少在我的系统上),以便它可以保存来自vector.size的所有可能的返回值( ).
或者至少,我认为这是正确的?
因此,有没有理由使用A而不是B:
A: for(uint64_t i = 0; i < v.size(); ++ i)
B: for(size_t i = 0; i < v.size(); ++ i)
如果我的解释错了或者您有更好的解释,请随时编辑.
编辑:我应该补充一点,我的理解是size_t行为像普通的无符号整数 - 也许这是不正确的?
我很困惑size_t.我知道这是一个未签名的类型..正确吗?我的问题是,何时应该使用它.是否有理由将它与常规数组一起使用?我的意思是必须声明数组大小真的很大,如此巨大,以至于常规的无符号或有符号无法处理它.然后一个size_t人能够处理它吗?有人能举个例子吗?
我知道C标准允许在哪里实现
(sizeof(unsigned) > sizeof(size_t))
Run Code Online (Sandbox Code Playgroud)
要么
(sizeof(int) > sizeof(ptrdiff_t))
Run Code Online (Sandbox Code Playgroud)
是真的.但是有没有真正的实现,其中一个是真的?
背景
我编写了一个类似于asprintf()(因为asprintf()不可移植)的函数,并snprintf()返回一个int但需要一个size_t参数,所以我应该检查leni(如下所示)是否不小SIZE_MAX于此代码?
va_copy(atmp,args)
int leni = vsnprintf(NULL,0,format,atmp); //get the size of the new string
va_end(atmp);
if(leni<0)
//do some error handling
if(leni>=SIZE_MAX) //do i need this part?
//error handling
size_t lens = ((size_t)leni)+1;
char *newString = malloc(lens);
if(!newString)
//do some error hanling
vsnprintf(newString,lens,format,args)!=lens-1)
Run Code Online (Sandbox Code Playgroud) %zuC 中的字符串格式化和之间有什么区别%lu?%lu用于unsigned long值并%zu用于size_t值,但实际上,size_t只是一个unsigned long. CppCheck 对此有所抱怨,但根据我的经验,这两种类型都适用。
只是%zu一种标准化的格式化方式,size_t因为size_t很常用,还是还有更多内容?