使用int与int8_t有任何性能差异

Dai*_*arf 11 c types micro-optimization

我的主要问题是,执行时间int和int8_t之间有什么区别吗?

在我正在研究的框架中,我经常阅读代码,其中一些参数被设置为int8_t函数,因为"该特定参数不能超出-126,125范围".

在很多地方,int8_t用于通信协议,或将数据包分成多个字段__attribute((packed)) struct.

但是在某些时候,它主要是因为有人认为使用与数据大小更匹配的类型会更好,可能会先考虑编译器.

鉴于代码是在Linux上运行,使用glibc使用gcc编译,并且内存或可移植性不是问题,我想知道它是否真的是一个好主意,性能方面.

我的第一印象来自于"试图比编译器更聪明的规则总是一个坏主意"(除非您知道需要优化的位置和方式).

但是,我不知道使用int8_t是否实际上是性能成本(更多测试和计算以匹配int8_t大小,需要更多操作来确保变量不会超出范围等),或者它确实提高了性能某种方式.

我不擅长阅读简单的asm,所以我没有将测试代码编译成asm以试图知道哪个更好.

我试图找到一个相关的问题,但所有讨论中,我发现int<size>_tint约可移植性,而不是性能.

感谢您的输入.我们将非常感谢组装样品的解释或有关此问题的来源.

use*_*733 10

int通常等于CPU上寄存器的大小.C标准表示int在使用运算符之前必须将任何较小的类型转换为.

这些转换(符号扩展)可能代价高昂.

int8_t a=1, b=2, c=3;
 ...
a = b + c; // This will translate to: a = (int8_t)((int)b + (int)c);
Run Code Online (Sandbox Code Playgroud)

如果你需要速度,int是安全的赌注,或使用int_fast8_t(甚至更安全).如果确切的大小很重要,请使用int8_t(如果可用).

  • 此外,曾经有一段时间,当时最新和最好的英特尔CPU的手册(如果我没记错的话,早期386)清楚地表明接受字节操作数的许多指令将花费一个时钟周期来执行比处理双字操作数的等效指令. (2认同)