应该使用 const 声明将只读数据元素移动到文本段中。例如,以下字符串位于 .data 节中,此节属于可写数据段。
char *rdstr = "this is a read-only string";
相反,以下字符串位于 .rodata 节中,此节是文本段中的只读数据节。
const char *rdstr = "this is a read-only string";
通过将只读元素移动到文本段中来减小数据段是一种极好的方法。但是,移动需要重定位的数据元素可能会达不到预期目标。例如,请查看以下字符串数组。
char *rdstrs[] = { "this is a read-only string", "this is another read-only string" };
较好的定义可能会使用以下定义。
const char *const rdstrs[] = { .... };
此定义可确保将字符串以及指向这些字符串的指针数组放在 .rodata 节中。遗憾的是,虽然用户将地址数组视为只读,但是在运行时必须重定位这些地址。因此,此定义会导致创建文本重定位。将此定义表示为:
const char *rdstrs[] = { .... };
将确保在可重定位数组指针的可写数据段中维护这些指针。数组字符串将在只读文本段中维护。