【问题标题】:Using a local short to pass a value into a function expecting an int; does this save memory?使用局部short 将值传递给期望int 的函数;这会节省内存吗?
【发布时间】:2014-01-31 18:44:01
【问题描述】:

我在嵌入式系统上(第一次)并且拥有高达 512 个字节的内存。我不断地遇到这个障碍,我希望尽可能节省每一个字节。因此,以下问题:

在 SDK 中有一个函数,原型化:

void foo(int val);

因此,我的主要看起来像:

void main() {
    int myVal = 0;
    // do stuff to compute myVal
    foo(myVal);
}

然而,myVal 的值永远不会超过 ~100。这样做会节省内存吗?

void main() {
    short int myVal = 0;
    // do stuff to compute myVal
    foo(myVal);
}

edit: 在这个架构上,int 是 4 字节,short 是 2 字节。我主要不确定使用本地短(或字符,或其他)是否会节省空间,因为它必须向上转换以满足 foo(int) 原型。

【问题讨论】:

  • stackoverflow.com/questions/589575/size-of-int-long-etc 这可能会对您有所帮助。也可以调用sizeof方法查看是否有差异。
  • 我会查看两种情况下生成的程序集并进行比较。在某些系统上,编译器可能会通过寄存器传递函数参数。如果是这种情况,您可能会在 main() 中节省 2 字节的堆栈空间(假设是 4 字节的 int)。
  • 对于这么小的值,您甚至可以使用char
  • 您可以两种方式构建项目,然后比较链接器生成的 .map 文件中的部分大小。
  • @nervosol:我知道这些结构有不同的大小。 :) 不过谢谢。我不确定第二个实现是否会节省 2 个字节,因为无论如何它都必须为 foo 参数转换为 int。

标签: c++ memory embedded


【解决方案1】:

我对这么小的系统没有经验;所以以下只是一个猜测(我使用过的最小的是 384 K)。

int 更改为short 或返回会使编译器的优化器工作,并且无法100% 准确地预测优化器的输出。

您的平台有某种将参数传递给函数的约定(ABI,可能与编译器一起记录)。我猜堆栈对齐到 4 个字节(int 的大小,对于您的平台来说应该是最“自然”的类型)。在这种情况下,如果您的代码使用堆栈来传递您的参数,那么内存消耗不会有任何差异。

但是:

  • 如果您的函数有 1 个或几个参数,它们将被放置在寄存器中而不是堆栈中(ARM 对前 4 个参数执行此操作),因此无需减少内存消耗
  • 如果你的main函数有两个short局部变量而不是一个,它们将占用4字节的堆栈空间,所以short优于int(和char,如果它有8位, 更好)
  • 如果你想发送两个参数而不是一个,你可以把它们塞进struct;那么 2 个short 参数将占用 4 个字节

最终,检查这类东西很容易。只需查看编译器的输出(机器指令)或告诉编译器测量堆栈的最大深度(gcc 可以做到;不确定您使用哪个编译器)。

【讨论】:

    猜你喜欢
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2019-03-29
    • 1970-01-01
    • 2010-10-18
    • 2018-04-28
    • 2018-09-26
    相关资源
    最近更新 更多