Il y a une grande augmentation des performances, mais vous devez faire très attention à la façon dont les données seront utilisées. Si un multi-thread vous devez fournir un contrôle d'accès aux données.
faire ce test:
#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;
}
Si vous en faites un paramètre, je dirais que c'est une optimisation parfaitement valide. – GManNickG
Si 'size' est constant, il y a peu de raison d'utiliser' new [] 'ici, soit de le déclarer sur la pile, soit de le passer dans la fonction comme d'autres l'ont suggéré. – Justicle
@Justicle: Parfois, l'espace de pile peut être un problème. Cela dit, j'aurais dû mentionner 'std :: vector' est plus approprié qu'un pointeur brut. – GManNickG