|
当时写C代码,其中有个矩阵乘法。这种没有技术含量的玩意我向来是懒得写的,就问同组的同事要。
同事给我,我问了接口,就直接拿着用了。写完后我就去吃饭了。
吃着吃着,我突然有点想不通一个问题。什么问题呢?
为什么同事给我的代码这么好用?
矩阵乘法方法的返回值应该是一个矩阵对吧?但是C语言是没有办法返回矩阵的。大公司的做法一般只有一种——将返回矩阵的地址作为入参,修改这个入参就可以了。
大概是这样:
void func( float input1[], float input2[], float output[]) 如果是要求不高的小公司,还有一种做法。就是在函数中定义一个static的矩阵,在这个矩阵上修改,然后返回矩阵地址。在主函数上建立一个地址,引用该函数的返回值。
大概是这样:
float *func(float input1[], float input2[]){
static float output[10] = {0};
//do something to output
return output;
}
void main(){
float *p;
p = func( input1, input2);
} 这种方法为什么不推荐用呢?主要问题是采用了static关键字,大公司不喜欢这种生存周期和函数不匹配的玩意。
不推荐用的原因还有一个,就是这个函数第二次被调用时,这个参数的地址还是不变的。换句话说,该参数的值会沿用上次的值。
然而我注意到同事给我的代码,入参并没有output。main函数也确实弄了一个句柄去接受函数func返回的地址。但同时没有出现我所说的问题。
我就很奇怪啊,什么时候C语言支持返回数组了?我就去看同事的函数。
看了之后我他妈大呼娘希匹!整个函数的逻辑是这样的。
float *func(float input1[], float input2[]){
static float output[99999][10] = {0};
int x =rand();
//do something to output[x]
return output[x];
} 他他妈为了避免第二次调用该函数会引发一维数组重复调用引发的问题,他直接建立了一个极大的二维数组,然后每次调用不同的一维数组,避免重复调用的问题。
最骚的是他调用不同的一维数组的方法是随机一个数。
我真是活到老学到老。
有些人没看懂。我尝试解释一下。
简单的说,正常的写法是函数制造一个数组,修改数组,返回数组地址。这样的问题是第二次调用的时候,返回的数组是同一个数组,会有问题。
这位Super Baby他妈的弄了99999个数组,每次随机取一个,修改好返回,于是第二次调用时不会返回同样的数组。
你可真是个小机机鬼啊! |
|