E***e 发帖数: 3430 | 1 被问到要给一个linear algebra library做adapter/wrapper
做最简单的运算重载比如加法
该library做c=a+b的时候是不分配内存的
直接把a+b的结果写入已经分配好的c
如果做了wrapper好像难免要先分配一块内存存储a+b
再赋值给c
这么一分配再一赋值降低了好几倍的效率
请问应该用什么办法做这个adapter/wrapper? |
s******y 发帖数: 416 | 2 没太明白。
为啥wrapper需要多分配一次内存?
【在 E***e 的大作中提到】 : 被问到要给一个linear algebra library做adapter/wrapper : 做最简单的运算重载比如加法 : 该library做c=a+b的时候是不分配内存的 : 直接把a+b的结果写入已经分配好的c : 如果做了wrapper好像难免要先分配一块内存存储a+b : 再赋值给c : 这么一分配再一赋值降低了好几倍的效率 : 请问应该用什么办法做这个adapter/wrapper?
|
E***e 发帖数: 3430 | 3 比如c=a+b
我能想到的最好办法是a+b存进一个临时变量然后赋值给c
临时变量就多出来一次内存分配
但是library能直接把a+b的值直接存进c里完全没有内存分配
非常羡慕
我不是cs出身编程基本功不好
谢谢指导
【在 s******y 的大作中提到】 : 没太明白。 : 为啥wrapper需要多分配一次内存?
|
s******y 发帖数: 416 | 4 把a+b地址给c就行了。smart pointer,不会泄露的。
【在 E***e 的大作中提到】 : 比如c=a+b : 我能想到的最好办法是a+b存进一个临时变量然后赋值给c : 临时变量就多出来一次内存分配 : 但是library能直接把a+b的值直接存进c里完全没有内存分配 : 非常羡慕 : 我不是cs出身编程基本功不好 : 谢谢指导
|
E***e 发帖数: 3430 | 5 这样a+b不还是开了一块内存?
理想情况是这样:
void PlusAssign(&c, &a, &b)
{
c=a;
c+=b;
}
完全没分配内存
但是这样不知道怎么做成加法重载
【在 s******y 的大作中提到】 : 把a+b地址给c就行了。smart pointer,不会泄露的。
|
s******y 发帖数: 416 | 6 但是c不用分配。
【在 E***e 的大作中提到】 : 这样a+b不还是开了一块内存? : 理想情况是这样: : void PlusAssign(&c, &a, &b) : { : c=a; : c+=b; : } : 完全没分配内存 : 但是这样不知道怎么做成加法重载
|
E***e 发帖数: 3430 | 7 不分配c容易实现
但是要match library
a+b也不能分配
【在 s******y 的大作中提到】 : 但是c不用分配。
|
w********h 发帖数: 48 | 8 用+=。非要用+的话,a+b返回一个新class的对象,包含该加法运算的meta info,重载
此class赋值到矩阵的运算符,在其中真正做加法。 |
E***e 发帖数: 3430 | 9 谢谢
C++11的move assignment是不是也可以考虑?
【在 w********h 的大作中提到】 : 用+=。非要用+的话,a+b返回一个新class的对象,包含该加法运算的meta info,重载 : 此class赋值到矩阵的运算符,在其中真正做加法。
|
N******K 发帖数: 10202 | 10 参考eigen armodillo 方案 比较复杂
问这个问题 就是变态
【在 E***e 的大作中提到】 : 被问到要给一个linear algebra library做adapter/wrapper : 做最简单的运算重载比如加法 : 该library做c=a+b的时候是不分配内存的 : 直接把a+b的结果写入已经分配好的c : 如果做了wrapper好像难免要先分配一块内存存储a+b : 再赋值给c : 这么一分配再一赋值降低了好几倍的效率 : 请问应该用什么办法做这个adapter/wrapper?
|
E***e 发帖数: 3430 | 11 搜了几天发现有现成方案:expression template
问问题的人估计也就是想听到这两个词没准备深究,算不上太变态了
【在 N******K 的大作中提到】 : 参考eigen armodillo 方案 比较复杂 : 问这个问题 就是变态
|