我正在编写游戏并希望使用数组来表示一块电路板。我正在寻找效率,因为我要进行多次迭代。在这种情况下,int数组或char数组似乎都很方便用于电路板表示。在int数组和char数组中进行操作时,效率方面有什么不同吗?
我怀疑由于char数组的每个元素都有1个字节的大小,因为内存中的表示形式不同,所以它可能会更慢(考虑到一个现代计算机至少有32位用于int表示)...我是对的?
提前致谢。
编辑:我将生成游戏树,这就是效率如此重要以及时间消耗的微小差异可以产生巨大差异的原因。
答案 0 :(得分:5)
哪个CPU / s?
有些CPU无法直接访问小于"某些东西",并且编译器需要生成一个"加载,移位和掩码"访问单个字节的指令序列。对于这种情况,使用int
应该会获胜。
某些CPU可以毫无问题地访问字节。在这种情况下(如果涉及的数据足够重要),问题可能是缓存大小和/或内存带宽;并且(至少对于80x86)我期望char
只会因为更多数据打包到每个缓存行而获胜。
对于哪种算法?
如果您可以向其发送SIMD,char
很可能获胜。例如,使用128位SIMD,每条指令可以处理16个字节,或者每条指令可以处理4个(32位)整数,char
可能只有4倍。
最好的建议是使用类似的东西:
#ifdef USE_INT
typedef int thingy
#else
typedef unsigned char thingy
#endif
然后您可以对其进行分析并随时更改。
答案 1 :(得分:4)
char
通常为1字节对齐,int
通常为4字节对齐。假设您正在使用遵循此标准的计算机,两个阵列都将其内容存储为连续的内存块(int
数组是char
数组大小的4倍)。因此,就它们如何利用分配的内存块而言,任何一个都不可能有任何不同。
话虽如此,即使底层内存表示有任何不同,我怀疑它会影响程序的吞吐量。
答案 2 :(得分:3)
试一试,看看。使用-S标志来获取汇编代码:
gcc -Wall -S code.c -o code.s
查看生成的代码长度是否存在明显差异。这不一定是整个故事,因为您需要了解汇编程序来判断差异。但它可能会给你一个提示 - 可能是int和char将大致相同。
请注意,如果混合使用类型,几乎可以肯定使用char数组会稍慢一些。因此,如果您将数据存储在char数组中,然后使用int类型以某种方式“处理”它,那么每次在两者之间进行转换时,您可能会获得额外的指令。尝试使用-S。