关于tmp<volScalarField>&用法的疑问
-
在编写涉及到muEff的后处理函数时发现,使用下面方法得到muEff时,可以编译,但是计算结果是错的,或者浮点数溢出
const volScalarField& muEff = turbModel.muEff();
而改成以下形式时,计算结果是正确的
const tmp<volScalarField>& tmuEff = turbModel.muEff(); const volScalarField& muEff = tmuEff();
而对于其他变量,如T,U等,两种形式的写法没发现对计算结果有影响,请问tmp<volScalarField>&有什么意义吗?为什么有的变量要用这种写法?谢谢!
-
请问tmp<volScalarField>&有什么意义吗?为什么有的变量要用这种写法?谢谢!
减少内存占用以及更快的运行速度。你完全可以不用tmp,用的时候需要注意tmp有可能会被清理。
我有时也用tmp,但目前来看感觉不到什么好处,我只在2014年的时候对比过使用tmp和不适用tmp的内存占用,当然使用tmp内存占用更小。不过为了心理上增加速度减少内存,我会写很多tmp进去..
话说回来,2014年后就没专门测试过了,你感兴趣可以试试并交流!
-
tmp是智能指针,不应该用引用的方式返回。
-
@东岳
那没用tmp时,有时出错可能是内存占完了?
我是在functionobject里用,只是后处理时算一下,倒是不太在意速度,只求不要时不时出错。
-
@wwzhao 在 关于tmp<volScalarField>&用法的疑问 中说:
tmp是智能指针,不应该用引用的方式返回。
请问是指这句
const tmp<volScalarField>& tmuEff = turbModel.muEff();
还是指这句
const volScalarField& muEff = tmuEff();
我是照着下面写的,把三句并成了两句
const volVectorField& U = lookupObject<volVectorField>(fieldName_); const tmp<volTensorField> tgradU(fvc::grad(U)); const volTensorField& gradU = tgradU();
-
那没用tmp时,有时出错可能是内存占完了?
目前很少有这种情况,毕竟快2020年了。。。你的内存怎么说也得16G吧.. 内存泄漏更常见于你忘了清空,算3 5个小时发现内存全没了
-
//const tmp<volScalarField> tmuEff = turbModel.muEff(); // 错误,智能指针不能以引用方式返回 const tmp<volScalarField> tmuEff = turbModel.muEff(); // 正确 // 获得被封装对象的引用 const volScalarField& muEff = tmuEff(); // OpenFOAM 4 以前的用法 //const volScalarField& muEff = tmuEff.ref(); // OpenFOAM 4 以后的用法