首页 > 解决方案 > C/C++ 中的小型与相同类型的循环变量以提高性能

问题描述

假设我有一个大的嵌套循环形式

long long i, j, k, i_end, j_end;
...
for (i = 0; i < i_end; i++) {
  j_bgn = get_j_bgn(i);
  for (j = j_bgn; j < j_end; j++) {
    ...
  }
}

与一些大i_endj_end,说i_end = j_end = 10000000000。如果我知道它j_bgn总是很小,甚至可能总是要么0or 1,那么为此使用较小的类型是否有益于性能,例如signed char j_bgnlong long还是因为每次我们开始一个新循环时隐式转换,这会带来经常性成本j

我想这有一个很小的影响,但我想知道这样做的“正确”/迂腐方式:要么 1)保持所有循环变量的类型相同(并使用可以冷却所需的最大整数的最小类型),或 2) 独立选择每个循环变量的类型,使其尽可能小。

编辑

从我看到的评论/答案中,我需要提供更多信息:

我认为使用小于 32 位的类型是不值得的,但是使用 32 位类型j_bgn而不是也使用 64 位类型是否仍然有益(因为我确实需要jand j_end)?

标签: c++cloopstypesinteger

解决方案


这听起来像是<cstdint>为 C++ 或 C定义的“快速”数据类型的实际用例<stdint.h>

您可以使用int_fast8_t, int_fast16_t, int_fast32_t, orint_fast64_t或它们的无符号挂件来获得至少 8、16、32 或 64 字节大的最快整数类型。

我想如果你想真正迂腐,你应该选择这些,让编译器选择最快的选项。


推荐阅读