我想定义一个这样的预处理器语句:
#define INSERT_NOPS(num) .......
和我代码中的某个地方
INSERT_NOPS(10);
现在我希望我的预处理器推出以下代码:
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
asm volatile("nop");
我怎么能意识到这一点? (0℃; = NUM< 100000)
我不想在我的宏中使用任何if / else语句。
提前致谢!
答案 0 :(得分:3)
手动滚动远非微不足道。看看Boost Preprocessor Library,它适用于C和C ++。 BOOST_PP_REPEAT
做你想做的事:
#include <boost/preprocessor/repetition/repeat.hpp>
#define INSERT_NOP(z, n, data) asm volatile("nop");
#define INSERT_NOPS(num) BOOST_PP_REPEAT(num, INSERT_NOP, )
INSERT_NOPS(10)
证明:
$ g++ -E test.cc
[...]
asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop"); asm volatile("nop");
答案 1 :(得分:1)
我认为我没有使用Boost就找到了更好的解决方案:
#pragma GCC push_options
#pragma GCC optimize ("unroll-loops")
#pragma GCC optimize ("O2")
void nops() {
int i = 0;
for(; i < 10 ; i++) {
asm volatile("nop");
}
}
#pragma GCC pop_options
int main(void) {
nops();
}
编译:
gcc -c -o test.o -O3 test.c
看一下反汇编:
objdump -d test.o
test.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <nops>:
0: 90 nop
1: 90 nop
2: 90 nop
3: 90 nop
4: 90 nop
5: 90 nop
6: 90 nop
7: 90 nop
8: 90 nop
9: 90 nop
a: c3 retq
Disassembly of section .text.startup:
0000000000000000 <main>:
0: 31 c0 xor %eax,%eax
2: e8 00 00 00 00 callq 7 <main+0x7>
7: f3 c3 repz retq