代码之家  ›  专栏  ›  技术社区  ›  aramadia

C++中的内存重用

  •  4
  • aramadia  · 技术社区  · 15 年前

    只是想知道是否建议使用这种代码来提高性能?

    void functionCalledLotsofTimes() {
       static int *localarray = NULL;
    
       //size is a large constant > 10 000
       if (localarray == NULL) localarray = new int[size];  
    
       //Algorithm goes here
    }
    

    我也很好奇如何用现代C++编译器,比如G++来实现静态变量。它们是像全局变量一样处理的吗?

    4 回复  |  直到 15 年前
        1
  •  12
  •   Community CDub    8 年前

    不建议这样做,因为您正在向函数引入全局状态。当函数中有全局状态时,会产生副作用。副作用会导致问题,特别是在多线程程序中。

    Referential Transparency 更多信息。对于相同的输入,无论使用多少线程,您总是希望有相同的输出。

    如果希望提高效率,允许用户将缓冲区本身指定为参数之一。

    看看两者的区别 global and static variables here .

        2
  •  0
  •   lsalamon    15 年前

    性能有很大的提高,但是您必须非常小心如何使用数据。如果是多线程,则必须提供对数据的访问控制。
    进行此测试:

    #include <windows.h>
    #include <stdio.h>
    
    void StartTime ( LARGE_INTEGER * pTime )
    {
        QueryPerformanceCounter ( pTime );
    }
    
    ULONG EndTime( LARGE_INTEGER * pTime )
    {
        LARGE_INTEGER liDiff;
        LARGE_INTEGER liFreq;
    
        QueryPerformanceCounter(&liDiff);
    
        liDiff.QuadPart -= pTime->QuadPart;
        liDiff.QuadPart *= 1000; // Adjust to milliseconds, shouldn't overflow...
    
        (void)QueryPerformanceFrequency(&liFreq);
    
        return ((ULONG)(liDiff.QuadPart / liFreq.QuadPart));
    }
    
    void functionCalledLotsofTimesStatic(int size)
    {
       static int *localarray = NULL;
    
       //size is a large constant > 10 000
       if (localarray == NULL) localarray = new int[size];  
    
       //Algorithm goes here
    
    }
    
    void functionCalledLotsofTimesDynamic(int size)
    {
       int *localarray = NULL;
    
       //size is a large constant > 10 000
       if (localarray == NULL) localarray = new int[size];  
    
       //Algorithm goes here
    
       delete [] localarray;
    }
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        LARGE_INTEGER liTimeDynamic, liTimeStatic;
    
        StartTime ( & liTimeDynamic );
        for (int loop = 0; loop < 100000 ; loop++ )
        {
            functionCalledLotsofTimesDynamic ( 10000 );
        }
        printf ( "Time dynamic alocation : %lu milliseconds\n", EndTime(&liTimeDynamic));
    
        StartTime ( & liTimeStatic );
        for (int loop = 0; loop < 100000 ; loop++ )
        {
            functionCalledLotsofTimesStatic ( 10000 );
        }
        printf ( "Time staic alocation : %lu milliseconds\n", EndTime(&liTimeStatic));
    
        return 0;
    }
    
    
        3
  •  0
  •   fredoverflow    15 年前

    如果我没有弄错,那么检查静态变量是否已经初始化的测试无论如何都是由“系统”完成的。不需要自己动手。只是写

    static int *localarray = new int[size];
    

    只有第一次调用函数时,才会创建数组。

        4
  •  0
  •   Joris Timmermans    15 年前

    通常,这种代码隐藏在具有较大预分配缓冲区的自定义分配器类后面,因此“动态分配”实际上不是这样。

    许多STD::向量的实现有一种更基本的形式:默认情况下,它分配两个幂的“块”,这样在向量增长到两倍大小之前,不需要真正的新分配。