这里介绍一种C++的奇怪代码编写方式, 在追求高性能运算的环境下, 可以让性能和资源都达到较好的发挥. 但不是什么好的代码, 只适用于要求高效率的情况的小量代码使用.
以下的三种访问速度, 哪一种会是最快的?
1. 全局数据区的数据
2. 堆数据区的数据
3. 栈数据区的数据
答案是3, 栈空间里面的数据访问是最快的.
不论写入还是销毁还是读出, 都是栈空间是最快的, 没有测试过的人可以自行测试一下.
但利用栈空间, 一般都必须是写硬编码, 即编译以后, 大小就不能够改变的了, 假如按最大的变量来分配, 这样就显得有点浪费了, 速度上的差距可以忽略, 但栈空间的资源不是那么多, 这样使用显得有点浪费了, 采用如下的写法可以解决这类矛盾, 当然前提也是知道最大的空间要求, 并且不能够分配太多的栈空间.
思维方式: 把函数拆分为三个部分: 固定数据部分, 可变数据部分, 处理部分, 然后得出如下的代码写法:
static unsigned long Process( unsigned char* pStaticBuffer, unsigned char* pVariableBuffer, int nVarLen )
{
// now, we can get a static buffer and variable buffer to process
// instead of using global variant and heap variant which access speed lower than stack variant.
return 0;
}
#define VAR_RES(x) unsigned long __stdcall VariableResource##x( unsigned char* pStaticBuffer )\
{\
unsigned char buf[x];\
return VXProcess( pStaticBuffer, buf, x );\
}
VAR_RES(1)
VAR_RES(2)
VAR_RES(3)
VAR_RES(4)
VAR_RES(5)
VAR_RES(6)
typedef unsigned long (__stdcall *FN_Resource)( unsigned char* pStaticBuffer );
static FN_Resource g_VariableResource[] = {
NULL,
VariableResource1,
VariableResource2,
VariableResource3,
VariableResource4,
VariableResource5,
VariableResource6,
};
static unsigned long StaticResource( unsigned long ulVarResCnt )
{
unsigned char arStaticBuffer[1024];
return g_VariableResource[ulVarResCnt]( arStaticBuffer );
}
采用上述的方式, 利用宏和全局的函数映射表, 可以实现一个假的动态数组, 这个数组的空间是完全在栈里面的, 访问速度非常快, 适合运算类的处理, 对于多线程的编写也是非常有效的提高效率的.