在堆上使用unsigned

时间:2014-10-12 17:02:03

标签: c arrays performance unsigned-integer

我正在尝试在我编写的C程序中查找所有可以提高性能的实例。由于分配给堆的大型数组,程序在一些地方运行得非常慢,其中一些数组是整数数组。我已经在stackoverflow和其他来源中读到,如果没有负整数的实例,我们应该总是使用“unsigned”。

虽然我没有很多按两个因子划分的实例,但是通过进行这种改变,性能可以看到显着提升,对于大型int与unsigned int的内存处理存在差异吗?类似地,使用unsigned int初始化相同的数组时,使用calloc初始化大量的int会不同地运行吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

在ISO C(C99)中,int已签名且最小范围至少为-32767到32767 include, unsigned int是0到65535 include。

它们都以相同的比特数编码,因此,分配int的X数和unsigned int的X数不会产生单一的差异。

Mat指出,calloc甚至不关心你给它的类型。

答案 1 :(得分:1)

首先,“如果没有负整数的实例”,“应始终使用”无符号“的”总是“过于强大。这主要取决于个人偏好和/或编码标准。有人支持这两种方法。我个人更喜欢遵循该规则,即所有自然无符号的数量都由我的代码中的无符号类型表示。但在这种情况下使用带符号的类型并不一定代表设计错误。

其次,所有这些都与动态内存分配或大型数组无关。这些数组在内存中的行为方式完全独立于您在其中存储的数据类型。适当的内存管理对于实现良好的性能非常重要,但这是完全独立的事情,与使用有符号或无符号整数类型的问题无关。

第三,即使无符号类型在整数运算中正式表现更好,即使你的代码用这些整数执行大量工作,从有符号到无符号的转换也不太可能产生任何显着的性能提升。

答案 2 :(得分:1)

我认为你错误地解释了你认为的建议。无论是使用有符号还是无符号整数类型,都可以在性能方面采用任何一种方式,但除非您确实需要优化已经测量成为瓶颈的特定瓶颈,否则应始终选择类型传达预期的语义,而不是某种人告诉你的类型更快"。

至于您提出的具体问题,无法在堆上搜索特定类型的数据"。 C中的对象不带有它们的类型作为其表示的一部分;虽然它们正式具有类型,但类型在访问它们的代码中表示,而不是在对象本身中。因此,如果要搜索有符号或无符号整数对象的使用,则应搜索源代码,而不是堆。但同样,这不是解决性能问题的方法。

答案 3 :(得分:0)

堆分配是C由malloc完成,{{1}}对您的意图一无所知。