一、说明
在内存很受限的嵌入式系统中作开发时,经常会出现内存超标了,在这种情况下,就需要对ARM中RO,RW和ZI区段分别存放什么数据有深入的理解。
一般来说一个ARM程序包含3部分:RO,RW和ZI区段。
RO是程序中的指令和常量,RW是程序中的已初始化变量,ZI是程序中的未初始化的变量。
由以上3点说明可以理解为:
RO就是readonly,RW就是read/write,ZI就是zero。
二、使用
1、RO Data
所有指令编译后的数据是属于RO Data区段的。
对于使用const定义的基本数据类型以及结构(这里并不包括class)都是属于RO Data区段,定义在一个class外或者定义在class内部都是如此。
如定义在class外:
const int age= 6;
typedef struct
{
char name[20];
int age;
int birth;
}struct_person;
const struct_person st_per[2] = {{"name1", age1, birth1}, {"name2", age2, birth2}};
如定义在class中:
class A
{
private:
const static struct_person st_per[2];
};
const struct_person A::st_per[2] = {"name1", age1, birth1}, {"name2", age2, birth2}};
在如上的代码中,age,st_per的数据都是存放在RO Data区段中的。如果其中的struct_person不定义为结构,而定义为类,那么情况又当如何呢?
2、RW Data
对于未使用const定义的变量而且初始化过的变量是属于RW Data区段的,定义在class外和class中都是如此。
如:
int age = 6;
struct_person st_per[2] = {{"name1", age1, birth1}, {"name2", age2, birth2}};
class A
{
private:
struct_person st_per[2];
};
3、ZI Data
对于未使用const定义的变量而且未初始化过的变量是属于RW Data区段的。
如:int age;
但有一点例外,在一个class中,定义一个const的类变量或者类的数组,如将上面提到的struct_person定义为class,则这个变量占用ZI Data区段。
如:
class class_person
{
public:
class_person(name, age, birth);
private:
char name[20];
int age;
int birth;
};
class A
{
private:
const static class_person st_per[2];
};
const class_person A::st_per[2] = {class_person ("name1", age1, birth1), class_person "name2", age2, birth2)};在这种情况下,st_per类数组的值在编译期无法确定下来,而只能在运行期通过类的构造函数确定,所以编译器会将其放入ZI Data区段。
三、总结
在资源受限的系统下做开发,需要并永远记住的第一条就是:节约资源。