Ste*_*rst 3 c++ optimization performance
请考虑以下代码.
DoSomething1()在1000次连续执行中比DoSomething2()更快吗?我会假设,如果我在哪里调用DoSomething1()它1000次,它会比调用DoSomething2()1000倍更快.
使我的所有大缓冲区都静止有什么不利吗?
#define MAX_BUFFER_LENGTH 1024*5
void DoSomething1()
{
static char buf[MAX_BUFFER_LENGTH] ;
memset( buf, 0, MAX_BUFFER_LENGTH );
}
void DoSomething2()
{
char buf[MAX_BUFFER_LENGTH] ;
memset( buf, 0, MAX_BUFFER_LENGTH );
}
Run Code Online (Sandbox Code Playgroud)
感谢您的时间.
静态缓冲区的缺点:
静态缓冲区的优点:
如果在VC++编译器中启用了/ GS,则堆栈分配会稍微贵一些,这样可以对缓冲区溢出进行安全检查(默认情况下/ GS处于打开状态).真的,你应该分析这两个选项,看看哪个更快.静态内存中的缓存局部性与堆栈中的缓存局部性可能会产生差异.
这是非静态版本,VC++编译器带/ O2.
_main PROC ; COMDAT
; Line 5
mov eax, 5124 ; 00001404H
call __chkstk
mov eax, DWORD PTR ___security_cookie
xor eax, esp
mov DWORD PTR __$ArrayPad$[esp+5124], eax
; Line 7
push 5120 ; 00001400H
lea eax, DWORD PTR _buf$[esp+5128]
push 0
push eax
call _memset
; Line 9
mov ecx, DWORD PTR __$ArrayPad$[esp+5136]
movsx eax, BYTE PTR _buf$[esp+5139]
add esp, 12 ; 0000000cH
xor ecx, esp
call @__security_check_cookie@4
add esp, 5124 ; 00001404H
ret 0
_main ENDP
_TEXT ENDS
Run Code Online (Sandbox Code Playgroud)
这是静态版本
; COMDAT _main
_TEXT SEGMENT
_main PROC ; COMDAT
; Line 7
push 5120 ; 00001400H
push 0
push OFFSET ?buf@?1??main@@9@4PADA
call _memset
; Line 8
movsx eax, BYTE PTR ?buf@?1??main@@9@4PADA+3
add esp, 12 ; 0000000cH
; Line 9
ret 0
_main ENDP
_TEXT ENDS
END
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2479 次 |
| 最近记录: |