我试图确定Visual C++ 2008或2010是否支持loop unswitching compiler optimization。我知道gcc支持它。Visual C++支持循环不切换吗?
回答
据我所知, “否”:
可能会因人而异,取决于:
无论你是否有最新的编译器(2010 MSVS)
是否已购买MSVS Professional或更高版本
所以我只是用VS2010试了一下:
void foo(int* x, int* y, int length, int w) {
for (int i = 0; i < length; i++) {
x[i] = x[i] + y[i];
if (w) {
y[i] = 0;
}
}
}
int main() {
int x[1000];
int y[1000];
int w;
scanf("%d", &w);
foo(x, y, 1000, w);
int sum = 0;
for (int i = 0; i < 1000; i++) {
if (y[i])
sum++;
}
printf("%d\n", sum);
return 0;
}
有点超过必要的复杂,以确保它不会优化功能了。无论如何,这导致以下反汇编:
PUBLIC [email protected]@[email protected] ; foo
; Function compile flags: /Ogtp
; COMDAT [email protected]@[email protected]
_TEXT SEGMENT
[email protected]@[email protected] PROC ; foo, COMDAT
; _x$ = ecx
; _y$ = eax
; _w$ = esi
; Line 12
sub ecx, eax
mov edx, 1000 ; 000003e8H
push edi
[email protected]:
; Line 10
mov edi, DWORD PTR [eax]
add DWORD PTR [ecx+eax], edi
; Line 11
test esi, esi
je SHORT [email protected]
; Line 12
mov DWORD PTR [eax], 0
[email protected]:
; Line 9
add eax, 4
dec edx
jne SHORT [email protected]
pop edi
; Line 15
ret 0
[email protected]@[email protected] ENDP ; foo
编译为发布项目,32位下VS2010 Premium,Win7 x64。
看起来它没有这样做,但我在装配时很生疏,从来没有像英特尔组装那么好。 – hippietrail
对不起,我忘了分析汇编 - 讨论移情;)但是,我们有一个循环(总是测试内部的W)。它实际上是'push edi'和'pop edi'之间的代码,'test esi,esi'是我们测试w为0的部分(如果跳过下一个mov指令)。 – Voo
请注意,由于根据实际版本讨论了不同的优化:这是在VS2010 Premium上运行的。 – Voo
- 1. `sqlite3`支持循环吗?
- 2. c#切换字体如果不支持
- 3. SBT支持循环依赖吗?
- 4. XmlSerializer可以支持循环引用吗?
- 5. MSVC10 Visual Studio 2010是否支持基于C++范围的循环
- 6. 确实visual C++ 6.0支持unicode吗?
- 7. F#visual studio环境支持
- 8. While循环的C++切换语句
- 9. Android密码可见性切换不支持支持库25?
- 10. 循环范围:VS 2008不支持它吗?
- 11. OpenMP不支持循环中断
- 12. 如何在C/C++中不使用循环切换n次?
- 13. CDT visual C++支持错误
- 14. 支持类中的每个循环
- 15. 循环切换语句
- 16. 循环切换语句
- 17. Unobtrusive在循环中切换
- 18. jQuery的循环切换ID
- 19. 在Java中切换循环
- 20. 图库切换器(c#visual)
- 21. 将Visual Studio切换到C#?
- 22. 中断语句不在循环内或在C中切换
- 23. Visual Studio c#数组循环
- 24. Visual C++ infinite while循环
- 25. 不支持linux 3.7.1支持ext2吗?
- 26. Visual C++与C + + 11和线程支持
- 27. C支持重载吗?
- 28. GNU Global支持objective-c吗?
- 29. C支持基础类吗?
- 30. C#支持程序吗?
AFAIK可用的编译器优化不依赖于您购买的MSVC版本。他们将更多IDE功能添加到更昂贵的版本中。 – Praetorian
我只有免费的Express版本,并认为与pricier版本的差异将是喜欢IDE的东西而不是编译器本身。但@ paulsm4:[似乎是正确的!](http://msdn.microsoft.com/en-us/library/aa271022(VS.60).aspx) – hippietrail
@hippietrail:请注意,您已链接的页面适用到VC++ 6.0(大约1998年的编译器)。 –