在这个编译器输出中,我试图理解nopw指令的机器码编码是如何工作的:
00000000004004d0 <main>:
4004d0: eb fe jmp 4004d0 <main>
4004d2: 66 66 66 66 66 2e 0f nopw %cs:0x0(%rax,%rax,1)
4004d9: 1f 84 00 00 00 00 00
Run Code Online (Sandbox Code Playgroud)
在http://john.freml.in/amd64-nopl上有一些关于"nopw"的讨论.任何人都可以解释4004d2-4004e0的含义吗?从查看操作码列表,似乎66 ..代码是多字节扩展.我觉得我可能会得到一个比这更好的答案,除非我试图在几个小时内查看操作码列表.
asm输出来自C中的以下(疯狂)代码,它优化为简单的无限循环:
long i = 0;
main() {
recurse();
}
recurse() {
i++;
recurse();
}
Run Code Online (Sandbox Code Playgroud)
编译时gcc -O2,编译器识别无限递归并将其转换为无限循环; 它实际上做得很好,事实上,它实际上是在main()没有调用recurse()函数的情况下循环.
编者注:带NOP的填充函数并不特定于无限循环.在Godbolt编译器资源管理器中,这是一组具有一系列NOP长度的函数.
我很好奇Java如何对具有互斥条件的多个“ if”语句进行优化,但是我不具备自己分析该知识的知识。问题基本上是该问题的Java版本。“ if if”与“ if else if”的性能差异
我已经看到针对的if语句回答了return这个问题,但是这个问题是针对if具有互斥条件但不返回的语句。
1.多个if语句
if (x == 0) doSomething();
if (x == 2) doSomething();
if (x == 5) doSomething();
Run Code Online (Sandbox Code Playgroud)
2.链接的If-else语句
if (x == 0) doSomething();
else if (x == 2) doSomething();
else if (x == 5) doSomething();
Run Code Online (Sandbox Code Playgroud)
问题
#1和#2是否执行相同的编译后?
(另外:如果是这样,那么Java可以优化条件的复杂程度有多大?)
所以我有一个问题,我现在已经有很长一段时间了,使用 else if 和链式 if 语句之间有什么区别,它们不是产生相同的东西吗?例如,以这个基本示例为例:
short age {0};
std::cin >> age;
if(age > 18) cout << "You are an adult";
if(age < 18) cout << "YOu are a teen";
if(age == 0) cout << "YOu are born";
Run Code Online (Sandbox Code Playgroud)
和
short age {0};
std::cin >> age;
if(age > 18) cout << "You are an adult";
else if(age < 18) cout << "YOu are a teen";
else if(age == 0) cout << "YOu are born";
Run Code Online (Sandbox Code Playgroud)
它们有何不同?
作为一个例子,在开始时有很多ifs 和很多else if在一个之后if。我在下面添加了一些伪代码。
if (x=1)
print x;
if (x=2)
print x;
if (x=3)
print x;
Run Code Online (Sandbox Code Playgroud)
或者
if (x=1)
print x;
else if (x=2)
print x;
else if (x=3)
print x;
Run Code Online (Sandbox Code Playgroud)