C内存空间和#defines

时间:2009-08-28 07:28:53

标签: c embedded memory-management

我正在开发一个嵌入式系统,所以内存对我来说很宝贵。

重复出现的一个问题是,在尝试为其编译程序时,我的内存空间不足。这通常通过限制可能占用大量空间的typedef等数量来解决。

我用一个宏生成器来创建一个包含很多#define的文件。 其中一些是简单的值,另一些是边界检查

#define SIGNAL1 (float)0.03f
#define SIGNAL1_ISVALID(value) ((value >= 0.0f) && (value <= 10.0f))

现在,我没有使用所有这些定义。我使用了一些,但实际上并不是大多数。 我被告知,如果不使用它们,它们实际上并没有占用任何记忆,但我不确定这一点。我希望通过删除未使用的那些我可以释放一些额外的内存(但同样,我被告知这是毫无意义的。)

未使用的#define会占用任何内存空间吗?

4 个答案:

答案 0 :(得分:20)

不,除非使用#defines,否则#defines不会占用空间 - #define类似于find / replace;只要编译器看到左半部分,它就会在实际编译之前用右半部分替换它。

所以,如果你有:

float f = SIGNAL1;

编译器将按字面解释语句:

float f = (float)0.03f;

永远不会看到SIGNAL1,它不会出现在调试器中等等。

答案 1 :(得分:4)

  

这通常通过限制可能占用大量空间的typedef等数量来解决。

你似乎有点困惑,因为typedef在运行时不占用空间。它们只是数据类型的别名。现在您可能有大型结构的实例(typedef'd或其他),但它是占用空间的实例,而不是类型定义。我想知道这个陈述中可能包含的“等”。

在源代码中用它们的定义替换宏实例,并相应地生成代码,未使用的宏不会产生任何生成的代码。

占用空间的事情是:

  1. 可执行代码(函数/成员函数)
  2. 数据实例化(包括C ++对象实例)
  3. 分配给堆栈的空间量(或多线程系统中的堆栈)。
  4. 剩下的内容通常可用于动态内存分配(RAM),或者未使用或用于非易失性存储(Flash / EPROM)。

    减少内存使用主要是选择/设计高效数据结构,使用适当的数据类型以及高效的代码和算法设计。最好定位将获得最大利益的区域。要查看应用程序中对象和代码的大小,请使用链接器生成映射文件。这将告诉您哪些是最大的函数,以及全局和静态对象的大小。

    源文件文本长度不是代码大小的良好指南。大量的C代码是声明性的(通常头文件都是声明性的),并且不会生成占用代码或数据的内存。

    嵌入式系统并不一定意味着小内存,因此您应该指定。我曾经使用64Mb RAM和2Mb Flash的系统,甚至与许多系统相比也是适度的。然而,具有片上资源的典型微控制器通常会少得多(尤其是占用大量芯片面积的SRAM)。此外,您的系统是Harvard还是Von Neumann架构在这里是相关的,因为在哈佛架构中数据和代码空间是分开的,因此我们需要知道您缺少什么。如果Von Neumann,如果代码从ROM运行,代码/数据用法仍然相关,或者它是否在运行时从ROM复制到RAM(即不同类型的内存,即使它们位于相同的地址空间)

    克利福

答案 2 :(得分:0)

嗯,是的,不是。

不,未使用的#defines不会增加生成的二进制文件的大小。

是的,构建二进制文件时,编译器必须知道所有#defines(无论是否使用)。

根据您的问题,您使用编译器的方式有点模糊,但您似乎尝试直接在嵌入式设备上构建;你试过交叉编译器吗? :)

答案 3 :(得分:0)

未使用的#defines不占用生成的可执行文件中的空间。它们会在编译器本身编译内存中占用内存。