c - 在没有循环的情况下重复完全相同的代码段 1000 次
问题描述
出于某种原因(与性能测量有关),我需要重复一个代码段 1000 次(1024 次也可以),但没有“for”或任何其他循环。
显然,我很可能编写一个看起来像这样的宏:
#define RUN_1000_TIMES(x) \
x \
x \
x \
...
... /* (999+1 times the same line) */
...
x \
x
...然后将该宏应用于我的代码段。
但是有比 1000 行长的宏更优雅的解决方案吗?
解决方案
#define RUN_1024_TIMES(x) do {RUN_512_TIMES(x); RUN_512_TIMES(x); } while(0)
#define RUN_512_TIMES(x) do {RUN_256_TIMES(x); RUN_256_TIMES(x); } while(0)
#define RUN_256_TIMES(x) do {RUN_128_TIMES(x); RUN_128_TIMES(x); } while(0)
#define RUN_128_TIMES(x) do {RUN_64_TIMES(x); RUN_64_TIMES(x); } while(0)
#define RUN_64_TIMES(x) do {RUN_32_TIMES(x); RUN_32_TIMES(x); } while(0)
#define RUN_32_TIMES(x) do {RUN_16_TIMES(x); RUN_16_TIMES(x); } while(0)
#define RUN_16_TIMES(x) do {RUN_8_TIMES(x); RUN_8_TIMES(x); } while(0)
#define RUN_8_TIMES(x) do {RUN_4_TIMES(x); RUN_4_TIMES(x); } while(0)
#define RUN_4_TIMES(x) do {RUN_2_TIMES(x); RUN_2_TIMES(x); } while(0)
#define RUN_2_TIMES(x) do {x; x; } while(0)
这do{ ... } while(0)
仅适用于您使用 调用它的情况if (....) RUN_1024_TIMES(...);
。您可以在不需要时将其移除。
您也可以每个宏执行 3 次:
#define RUN_1000_TIMES(x) do {RUN_729_TIMES(x); RUN_243_TIMES(x); RUN_27_TIMES(x); x; } while(0)
#define RUN_729_TIMES(x) do {RUN_243_TIMES(x); RUN_243_TIMES(x); RUN_243_TIMES(x); } while(0)
#define RUN_243_TIMES(x) do {RUN_81_TIMES(x); RUN_81_TIMES(x); RUN_81_TIMES(x); } while(0)
#define RUN_81_TIMES(x) do {RUN_27_TIMES(x); RUN_27_TIMES(x); RUN_27_TIMES(x); } while(0)
#define RUN_27_TIMES(x) do {RUN_9_TIMES(x); RUN_9_TIMES(x); RUN_9_TIMES(x); } while(0)
#define RUN_9_TIMES(x) do {RUN_3_TIMES(x); RUN_3_TIMES(x); RUN_3_TIMES(x); } while(0)
#define RUN_3_TIMES(x) do {x; x; x; } while(0)
推荐阅读
- django - 为什么我在这里收到 PartialCredentialsError
- c# - 如何将枚举绑定到 ComboBox 并在 C# 中隐藏某个值
- c# - 如何转换 XPathEvaluate 的返回值?
- python - 如何使用 matplotlib 绘制更多 10k 点?
- javascript - 从另一个集合中获取数据 MongoDB 聚合 $lookup
- regex - 与字符串中的 sed 正则表达式匹配
- javascript - 如何在 CK Editor 5 中过滤内容
- javascript - React.js 在迭代时将列表项传递给数据库
- go - 为不同的 k8s api 版本固定 go.mod 依赖项
- javascript - 在媒体查询中滚动到底部时如何更改元素的不透明度