我最近开始在我的一些项目中使用英特尔 C++ 编译器,同时还学习了 masm 汇编。我不断听到为什么不值得学习汇编,因为编译器在优化代码方面做得很好,所以想一劳永逸地看看哪个更快。为了尝试这样做,我有以下 c++ 代码:
#include <iostream>
#include <time.h>
using namespace std;
extern "C" {
int Add(int a, int b);
}
int main(int argc, char * argv[]){
int startingTime = clock();
for (int i = 0; i < 100; i++)
{
cout << "normal: " << i << endl;
cout << 1000 + 1000 << endl;
}
int timeTaken1 = clock() - startingTime;
startingTime = clock();
for (int i = 0; i < 100; i++){
cout << "assem" << i << endl;
cout << Add(2000, 2000) << endl;
}
int timeTaken2 = clock() - startingTime;
cout << "Time taken under normal addition: " << timeTaken1 << endl;
cout << "Time taken under assembly addition: " << timeTaken2 << endl;
cin.get();
return 0;
}
以及以下masm代码:
.model flat
.386
.code
public _Add
_Add PROC
push ebp ;
mov ebp, esp ;
mov eax, [ebp + 8] ;
mov ebx, [ebp + 12] ;
add eax, ebx ;
leave ; cleanup
ret ;
_Add endp
end
我正在使用 Visual Studio 编译它,使用 Intel Composer 插件。当我在 Debug 模式下运行它时,它运行良好——我可以看到“normal 99”和“assem 99”以及相关的数字。当我使用为编译器指定的 /0d 运行它时,它也可以正常工作。但是,当指定/02、/0x 或/03 时,它只显示正常的(i+j) 加法循环和汇编程序加法的第一个值,即只显示汇编0 和4000。
我的猜测是英特尔编译器正在优化汇编代码(这适用于 VC++ 编译器),我很想知道为什么会发生这种情况以及如何解决它,同时仍然让英特尔优化 C++部分。
谢谢 SbSpider
编辑:我知道这是迟到了,但感谢所有的答复。似乎这是汇编代码中的错误,而不是英特尔编译器没有使用汇编代码。