我注意到现代的C和C++代码似乎size_t
代替int
/ unsigned int
几乎无处不在 - 从C字符串函数的参数到STL.我很好奇这个原因及其带来的好处.
我目前正在将我的代码库中的一些用法转换unsigned int
为size_t
我多年来一直在开发的代码库.我理解两者之间的区别,例如unsigned int
,指针可能是32位,size_t
可能是64位.我的问题更多的是关于我应该使用哪一个以及人们用来在两者之间进行选择的约定.
很明显,内存分配应该取size_t
而不是unsigned int
作为参数,或者容器类应该size_t
像STL一样用于大小和索引.这些是在阅读size_t
vs 的好处时提到的常见案例unsigned int
.但是,在进行代码库转换的过程中,我偶然发现了灰色区域中的不少情况,我不确定使用哪种情况.例如,如果4x4矩阵行/列索引应该是size_t
一致的,无论索引是否在范围[0,3]中,或者屏幕/纹理分辨率应该使用size_t
尽管在几千的范围内,或者一般如果合理的数量为对象应该在数十个范围内,我仍然应该使用它size_t
来保持一致性.
你用什么样的编码约定来unsigned int
和之间进行选择size_t
?表示大小(字节或对象)或索引的所有内容是否始终size_t
与合理预期的范围无关?是否有一些被广泛接受的size_t
惯例用于完善的图书馆,我可以遵循?
我使用的是Ubuntu 16.04.5和GCC 5.4.0版.
我在玩sizeof()
操作员,写下面的代码:
#include <stdio.h>
int main(int argc, char *argv[]){
long int mylint = 31331313131.1313;
printf("size of long int is %d\n", sizeof(mylint));
printf("size of long int is %d\n", sizeof(long int));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用gcc -o ... ...
命令编译并期待:
size of long int is 8
size of long int is 8
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
fl_double_lint.c: In function ‘main’:
fl_double_lint.c:11:9: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]
printf("size of long …
Run Code Online (Sandbox Code Playgroud) 是否存在任何已size_t
定义为其他内容的实现unsigned int
?在我工作的每个系统下,它被定义为unsigned int,所以我只是好奇.