在C ++中重用内存

时间:2010-02-25 03:02:18

标签: c++ gcc memory-management

只是想知道这种代码建议提高性能吗?

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 个答案:

答案 0 :(得分:12)

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

有关详细信息,请参阅Referential Transparency。使用相同的输入,无论您使用多少线程,您始终都希望拥有相同的输出。

如果要提高效率,请允许用户将缓冲区本身指定为其中一个参数。

查看global and static variables here之间的区别。

答案 1 :(得分:0)

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

#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;
}

答案 2 :(得分:0)

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

static int *localarray = new int[size];

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

答案 3 :(得分:0)

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

std :: vector的许多实现都有一个更基本的实现形式:默认情况下,它以2的幂分配“块”内存,因此在向量增长之前不需要进行真正的新分配到两倍大小。