【发布时间】:2021-02-22 15:37:59
【问题描述】:
假设我有一个较大的表单嵌套循环
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_end 和j_end,比如i_end = j_end = 10000000000。如果我知道j_bgn 总是很小,甚至可能总是0 或1,那么为此使用较小的类型是否有益于性能,例如signed char j_bgn?或者,每次我们开始一个新的j 循环时,由于隐式转换为long long,这是否会带来经常性成本?
我想这有一个很小的影响,但我想知道这样做的“正确”/迂腐方式:要么 1)保持所有循环变量的类型相同(并使用可以冷却的最小类型所需的最大整数),或 2)独立选择每个循环变量的类型,使其尽可能小。
编辑
从我看到的 cmets/answers 我需要提供更多信息:
- 我有时想要,有时不想使用这些变量(例如
j)进行索引。为什么这很重要(只要我确保使用足够大的类型来覆盖我的可用内存)? - 在我的实际代码中,我使用
size_t(或ssize_t)之类的东西,例如j,j_end。在现代硬件上,这是 64 位。
我认为使用小于 32 位的类型是不值得的,但是对于 j_bgn 使用 32 位类型而不是也使用 64 位类型可能仍然有益(因为我确实需要 @987654338 @ 和j_end)?
【问题讨论】:
-
您期望使用较小的字体有什么好处?
-
一种安全的方法是为您的计数器使用与最终值类型相同的类型。它使代码保持清晰,并避免可能导致比较不正确的简单错误。
-
我不会费心使用小于自然
int的类型。它不会产生任何性能改进。这还取决于您的循环是否将这些变量用于其他用途(例如索引数组 - 在这种情况下应该考虑size_t) -
@EugeneSh。小于硬件的“本机”甚至可能导致某些处理器(例如 cortex-M)的一些性能损失
-
一个
int应该代表机器架构的字长(尽管现在通常是半字长:64 位架构上的 32 位),并且有与其他数据类型一样好或更好的性能。short或char不会比int快。如果您担心性能,请考虑使用快速的最小尺寸类型,例如std::int_fast32_t。