|
|
1
12
不建议这样做,因为您正在向函数引入全局状态。当函数中有全局状态时,会产生副作用。副作用会导致问题,特别是在多线程程序中。 见 Referential Transparency 更多信息。对于相同的输入,无论使用多少线程,您总是希望有相同的输出。 如果希望提高效率,允许用户将缓冲区本身指定为参数之一。 看看两者的区别 global and static variables here . |
|
2
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;
}
|
|
|
3
0
如果我没有弄错,那么检查静态变量是否已经初始化的测试无论如何都是由“系统”完成的。不需要自己动手。只是写
只有第一次调用函数时,才会创建数组。 |
|
4
0
通常,这种代码隐藏在具有较大预分配缓冲区的自定义分配器类后面,因此“动态分配”实际上不是这样。 许多STD::向量的实现有一种更基本的形式:默认情况下,它分配两个幂的“块”,这样在向量增长到两倍大小之前,不需要真正的新分配。 |
|
AstralHex · 矩阵乘法代码工作不正常 8 月前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 8 月前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 8 月前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 8 月前 |