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

Is there any performance difference in using int versus int8_t

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

在我正在开发的框架中,我经常阅读代码,其中某些参数在函数中设置为 int8_t 因为 "that particular parameter cannot be outside the -126,125 range".

在很多地方,int8_t用于通信协议,或者将一个数据包切割成很多字段成为__attribute((packed)) struct

但在某些时候,它被放在那里主要是因为有人认为使用更接近数据大小的类型会更好,可能比编译器先考虑。

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

我的第一印象来自规则"Trying to be smarter than the compiler is always a bad idea"(除非您知道需要优化的位置和方式)。

但是,我不知道使用int8_t是否真的是性能的代价(更多的测试和计算来匹配int8_t的大小,需要更多的操作来确保变量不去越界等),或者它确实以某种方式提高了性能。

我不擅长看简单的asm,所以没有把测试代码编译成asm,想知道哪个更好。

我试图找到一个相关问题,但我在 int<size>_tint 上找到的所有讨论都是关于可移植性而不是性能。

感谢您的意见。非常感谢有关此问题的组装示例解释或来源。

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);

如果您需要速度,int 是一个安全的选择,或者使用 int_fast8_t(更安全)。如果精确尺寸很重要,请使用 int8_t(如果可用)。

当您谈论代码性能时,您需要考虑影响此性能的几件事:

  • CPU 架构,更重要的是,cpu 本身支持哪些数据类型(它支持 8 位操作吗?16 位?32 位?等。 ..)

  • 编译器,使用知名编译器是不够的,您需要熟悉它:它们编写代码的方式会影响它生成的代码

  • 数据类型和编译器内在函数:编译器在生成代码时始终会考虑这些,使用正确的数据类型(即使是有符号与无符号问题)也会对性能产生显着影响。

    “试图比编译器更聪明总是一个坏主意”——事实并非如此;请记住,编写编译器是为了优化一般情况,而您对特定情况感兴趣;尝试比编译器更聪明总是一个好主意。

你的问题真的太宽泛了,我无法给出一个“切中要害”的答案(即什么是更好的性能)。唯一确定的方法是检查生成的汇编代码;至少计算一下代码在这两种情况下执行所需的周期数。但是你需要看懂代码才能明白如何帮助编译器。