【发布时间】:2016-08-15 20:03:49
【问题描述】:
我有以下结构排列:
typedef struct {
int a;
} Foo;
const Foo END = {0};
const Foo table_1[] = {
{2}, {0}
};
const Foo table_2[] = {
{2}, END
};
基本上,我有一个结构,以及该结构的几个数组。现在,这些数组的内容永远不会改变:它们是一些在运行时使用的查找表,因此,在嵌入式环境中,我希望这些数据驻留在 ROM 中(我是 very RAM-受限,实际上是为每几个字节而战)。可以想象,没有什么可以阻止所有这些表驻留在 ROM 中(一切都是 const)。
实际上,table_1 以 .rodata 结尾(因此在启动期间它不会被复制到 RAM 中)和 table_2 - 在 .data 中(同时消耗 ROM 和 RAM)。反汇编目标文件时,我还可以看到一些代码,初始化table_2。
我希望所有上述数组都以.rodata 结尾,但似乎只有当我“完整”写出结构初始化时才会发生(抱歉,不确定,正确的术语是什么) .
这些初始化有什么区别?因为只是初始化不同 - 类型相同,实际数据也相同。是否正在进行某种优化(想知道这里优化了什么)?有没有办法禁用它?我的意思是,我可以 #define 离开所有常见的表成员并完成它,但这似乎是一个 hack,此外,我真的很想了解这里发生了什么。
我正在使用 gcc-arm-none-eabi 工具链,使用 -Os 构建,gcc 版本是 4.8.1。
【问题讨论】:
-
看起来编译器无法优化子表达式不是文字的情况,即使它是
const表达式。 -
您使用的是 C 还是 C++?也许使用 C++ 你可以使用
constexpr。 -
为什么要禁用优化?优化就是在第一个示例中将其放入
.rodata中,这似乎是您想要它做的事情。 -
尝试在定义(实现)前加上
static。 -
@ThomasMatthews 啊,不错,实际代码中定义为
static。不过这没什么区别。