Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C x64上是否需要int?_C_64 Bit - Fatal编程技术网

C x64上是否需要int?

C x64上是否需要int?,c,64-bit,C,64 Bit,前面已经讨论过,针对x64的C代码应该始终使用size\u t而不是int来表示计数和数组索引 考虑到这一点,在整个代码库中,只标准化size_t(typedef'd为更短的值)而不是通常的整数类型int,可能会更简单、更不容易出错 我有什么遗漏吗?假设您不需要带符号的整数,并且不存储由小整数组成的大数组(将其设置为32位而不是64位可以节省内存),是否有理由优先使用int而不是size\u t?正如Eli所说,int通常(并非总是)字大小,即,在内存和CPU周围移动对象的首选单元。因此,即使忽

前面已经讨论过,针对x64的C代码应该始终使用size\u t而不是int来表示计数和数组索引

考虑到这一点,在整个代码库中,只标准化size_t(typedef'd为更短的值)而不是通常的整数类型int,可能会更简单、更不容易出错


我有什么遗漏吗?假设您不需要带符号的整数,并且不存储由小整数组成的大数组(将其设置为32位而不是64位可以节省内存),是否有理由优先使用int而不是size\u t?

正如Eli所说,int通常(并非总是)字大小,即,在内存和CPU周围移动对象的首选单元。因此,即使忽略内存使用,也可能获得更好的性能

因此,我认为在不需要大于+/-(2^15-1)或特定宽度的范围时,使用“常规”有符号整数类型是非常合理的。

使用
size\t
“for counts”作为通用无符号整数类型几乎总是设计错误<代码>大小\u t仅足以容纳平台支持的最大连续对象的大小。这直接意味着它可以相当合理地用作对象中的字节计数或数组中的元素计数(或索引)(因为数组始终是连续对象)。但一旦我们摆脱了连续性要求,
size\u t
就不再起作用了。您不能有意义地使用
size\u t
来计算链表中的元素,因为在一般情况下
size\u t
的范围是不够的

当然,出于这种目的使用
size\u t
在概念上也是错误的<代码>大小\u t实现对象大小的概念,而不是对象计数的概念。使用
size\t
进行数组索引仅适用于抽象数组。使用
size\t
为具体的应用程序特定数组编制索引是很奇怪的


我个人更喜欢使用
unsigned
进行计数和数组索引(除非我有一个更具体的类型用于此目的),假设类型的范围在我的应用程序的域内是足够的。

我想说的是,相反,我更喜欢固定整数大小的东西,
uint8\u t
uint64\u t
(不久的某个时候,
unit128\u t
),这些将是基本类型。这样你就会知道你得到了什么

以及其他
typedef
类型,如
size\u t
,然后对它们进行别名。然后,您可以简单地检查
typedef
中的
uintprt\u t
并推断您的地址宽度,例如

而且,人们肯定需要签名类型。
但这种关系肯定可以澄清。现在已经在标准中,有符号类型在某种程度上是从无符号类型推导出来的。这可以通过强制使用前缀
进行签名
来明确。但可以肯定的是,后者不会发生,人们对
int
:)

有太多的情感依恋。按照这个词的正常用法,x86上的字长是64位;但实际上,为了向后兼容,int总是32位。在什么意义上说x86的字长是32位?什么操作在32位中更有效?@rwallace,这肯定不是真的。ILP64和SILP64都已经实现,它们都有64位整数。我没有资格深入谈论x86性能。但我不认为32位值在x86_64上的性能会更差。因此,我所说的一般(不适用于任何特定架构)规则仍然适用;我的意思是int=32位是主流,如果你在Linux下的Windows或GCC下运行微软C++,你会得到32位int,而不管CPU。在某些情况下,32位在x64上的性能较差,例如,因为在用作偏移量之前需要扩展到64位。困难的问题似乎是32位是否有更好的性能。@rwallace,@Matthew:如果有一天你想用标准类型拥有5种不同宽度(8,…,128)的整数类型,
int
将被固定为32位,没有太多选择。
size\u t
unsigned
更适合计数。查看
calloc
fread
fwrite
的参数。当然,可能存在一些病理结构,其中
大小\u t
小于对象的实际最大计数(例如,在链接列表中),因为内存分割或其他此类丑陋,但是有很多真正的体系结构,其中
unsigned
远小于对象的最大计数-基本上是运行任何Unix和Windows的任何64位计算机。@R..:特定于应用程序的容器中对象的最大计数由应用程序域决定,而不是由体系结构决定。我明确表示,只有在我的应用程序域中其范围足够大的情况下,我才会使用
unsigned
<代码>大小\u t永远不适合用于该目的,无论其范围如何,因为它实现的概念并不正确。这就像使用一种指定温度的类型来计算篮子中的苹果,只是因为它的范围恰好“足够大”。@R..:我不清楚这里引用的
calloc
fwrite
是什么。所有这些函数都使用数组元素计数,而不是泛型计数,我已经在回答中介绍过了。@R:“至于“病理架构”。。。他们没有什么病态的。真正病态的是,当代程序员无法在平面内存模型之外进行思考。在任何情况下,如果有人因为总内存限制而想使用一个“总是足够”的整数类型,那将是
intptr\u t
\
uintpr\u t
,而不是