大缓冲区与大型静态缓冲区有比较优势吗?

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)

感谢您的时间.

Bri*_*ndy 8

静态缓冲区的缺点:

  • 如果你需要线程安全,那么使用静态缓冲区可能不是一个好主意.
  • 直到程序结束才会释放内存,从而使内存消耗更高.

静态缓冲区的优点:

  • 使用静态缓冲区的分配较少.您不需要每次都在堆栈上进行分配.
  • 使用静态缓冲区,由于分配过高,堆栈溢出的可能性较小.

  • 堆栈分配很快,所以我不会担心。不过,堆栈溢出是我非常担心的事情。 (2认同)

Dre*_*ins 6

如果在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)