Openfoam基于C++分配内存的基础
提示:此处是对OpenFOAM内OpenFOAM-9/applications/test/alloc内文件的注释以及改动
前言
提示:为了学习OpenFOAM才对此处文件进行注释,方便未来的学习 例如:在OpenFOAM的学习中经常看到许多的new其实际是分配内存。
一、文件结构
test/alloc文件下的使用tree命令查看结构会发现1个directory和6个files。 分别是Make/files Make/options Test.C Test_alloc.C Test_malloc.C Test_new.C 提示:使用wmake编译器是为了更好管理头文件和库以及管理产生的执行文件。 Make文件夹中的是files和options文件。
- files写入的是要进行编译的C++文件,以及编译后产生的执行文件存放路径和名字。
- options写入的是在C++文件中使用的头文件和库的路径,因为OpenFOAM对C++的内容进行了扩展,形成了自己的头文件和库,所以在使用C++进行编写求解器的时候需要对文件路径进行写入。
- Test_alloc.C功能:使用new分配内存地址给指针
- Test_new.C功能:使用new分大量存储数组的内存地址给指针(为了看内存的地址,这里被我改写了)
- Test_malloc.C功能:使用malloc函数分配内存,注意与new的两大不同点。
- Test.C功能:不仅仅是对new的运用,也可以理解成为OpenFOAM中基础数据类型(表类型)list的定义方式。
提示:有些地方因为stearm头文件不存在的原因,但IOstearm存在,所以也就没有加路径,直接使用改换头文件解决。
二、Make文件夹
1.files
代码如下(示例):
#执行的文件名
#Test-alloc.C
#Test-new.C
#Test-malloc.C
Test.C
#执行命令的定义
#EXE = $(FOAM_USER_APPBIN)/Test-alloc
EXE = $(FOAM_USER_APPBIN)/Test
#EXE = $(FOAM_USER_APPBIN)/Test-new
#EXE = $(FOAM_USER_APPBIN)/Test-malloc
编译后的EXE执行文件存储在$(FOAM_USER_APPBIN)文件夹中,命名为Test。 $(FOAM_USER_APPBIN)=/home/UserName/OpenFOAM/UserName-9/platforms/linux64GccDPInt32Opt/bin
三、C++文件
1.Test_alloc.C
代码如下(示例):
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
main()
{
int *ptrs[5];
std::cerr << "allocating ints\n";
for (int i=0; i<5; i++)
{
ptrs[i] = (int*)malloc(sizeof(int));
std::cerr<<sizeof(int)<<std::endl;
std::cerr<<sizeof(double)<<std::endl;
std::cout<<" "<<std::endl;
}
}
2.Test-new.C
代码如下(示例):
#include <iostream>
using namespace std;
main()
{
int i,j;
int* intPtrs[5];
cerr << "allocating ints\n";
for (int i=0; i<5; i++)
{
intPtrs[i] = new int[1];
cerr<< intPtrs[i]<<" ";
}
cerr << "allocated ints\n";
cerr << "deallocating ints\n";
for (int i=0; i<5; i++)
{
delete[] intPtrs[i];
}
cerr << "deallocated ints\n";
cerr << "allocating doubles\n";
double* doubles[5];
for (j=0;j<5;j++)
{
doubles[j] = new double[5];
cerr<< doubles[j]<<" ";
}
for (int i=0; i<5; i++)
{
delete[] doubles[i];
}
}
3.Test_malloc.C
代码如下:
#include <unistd.h>
#include <stdlib.h>
#include <iostream>
main()
{
int *ptrs[5];
std::cerr << "allocating ints\n";
for (int i=0; i<5; i++)
{
ptrs[i] = (int*)malloc(sizeof(int));
std::cerr<<sizeof(int)<<std::endl;
std::cerr<<sizeof(double)<<std::endl;
std::cout<<" "<<std::endl;
}
}
4.Test
代码如下:
#include <stdlib.h>
#include <iostream>
class Int
{
int I;
public:
Int(){}
operator int()
{
return I;
}
};
template<class T>
class List : public T
{
T* v;
int sz;
public:
List()
{
v = new T[sz=11];
}
List(int s)
{
v = new T[sz=s];
std::cout<<"v指针的地址="<<v<<std::endl;
std::cout<<"v地址内存储的值是:"<< *v<<std::endl;
}
~List()
{
delete[] v;
}
inline int size() const;
};
template<class T>
inline int List<T>::size() const
{
return sz;
}
#include <iostream>
int main()
{
typedef List<Int> intList;
intList list(20);
std::cout << "listsize:" <<list.size() << "\n";
std::cerr <<"over" <<std::endl;
return 0;
}
四、编译
在终端中敲入命令如下:
$wmake
$Test
|