c++ - 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_end
和j_end
,说i_end = j_end = 10000000000
。如果我知道它j_bgn
总是很小,甚至可能总是要么0
or 1
,那么为此使用较小的类型是否有益于性能,例如signed char j_bgn
?long long
还是因为每次我们开始一个新循环时隐式转换,这会带来经常性成本j
?
我想这有一个很小的影响,但我想知道这样做的“正确”/迂腐方式:要么 1)保持所有循环变量的类型相同(并使用可以冷却所需的最大整数的最小类型),或 2) 独立选择每个循环变量的类型,使其尽可能小。
编辑
从我看到的评论/答案中,我需要提供更多信息:
- 我有时想要有时不想使用这些变量(例如
j
)进行索引。为什么这是相关的(只要我确保使用足够大的类型来覆盖我的可用内存)? - 在我的实际代码中,我使用
size_t
(或ssize_t
)之类的东西,例如j
,j_end
。在现代硬件上,这是 64 位。
我认为使用小于 32 位的类型是不值得的,但是使用 32 位类型j_bgn
而不是也使用 64 位类型是否仍然有益(因为我确实需要j
and j_end
)?
解决方案
这听起来像是<cstdint>
为 C++ 或 C定义的“快速”数据类型的实际用例<stdint.h>
。
您可以使用int_fast8_t
, int_fast16_t
, int_fast32_t
, orint_fast64_t
或它们的无符号挂件来获得至少 8、16、32 或 64 字节大的最快整数类型。
我想如果你想真正迂腐,你应该选择这些,让编译器选择最快的选项。
推荐阅读
- python - 读取文件时如何修复 UnicodeDecodeError
- angular - 如何在角度 10 中启用切换菜单
- google-apps-script - 为 Google 表格执行应用脚本代码时遇到问题
- lcd - 如何从数据表中计算 RK043FN48H-CT672B 的 HSYNC 和 VSYNC?
- typescript - 使用 Composition API 在 Vue 中处理子项和父项中的提交事件
- c++ - 在具有 vcpkg 静态导出的 CMake 项目中找不到“Qt5”
- python - 如何使用 OpenCV Python 在扫描图像中进行局部对比度增强
- spring-boot - Spring cloud gateway + keycloak 返回 404(未找到)
- jquery-ui - 使用 JQuery UI 和移动图标制作库存
- python - 如何在使用 Selenium 和 Python 自动填充其默认文本之前填充 javascript 小部件