【问题标题】:difference between array and pointer to array数组和指向数组的指针的区别
【发布时间】:2021-06-10 09:41:26
【问题描述】:

你好堆栈溢出社区,

由于嵌入式系统资源有限,我们必须注意内存分配。

所以,我的问题是关于这个话题(如何节省内存?)

假设我们有这段代码:

extern float externArray[2500];
float testArray[2500];
void fillArray()
{
for (unsigned i = 0; i < sizeof(testArray) / sizeof(float); i++)
  testArray[i] = externArray[i];
}

如果您想知道我为什么要将 externArray 复制到 testArray 中,我的应用程序要求我这样做(因为我会将 externArray 传递给一个将修改其值的函数)。如果您有更好的方法来做到这一点,欢迎您的反馈。

现在我已经做到了:

extern float externArray[2500];
float *testArray;
void fillArray()
{
testArray = (float*) malloc(2500 * sizeof(float));
for (unsigned i = 0; i < sizeof(externArray) / sizeof(float); i++) //here I have to change size of testArray to size of externArray because it's no more longer allocated on the stack
  testArray[i] = externArray[i];
}

所以我想知道第二个是否会因为我使用指向数组的指针而在内存方面更加优化?

使用更多堆是否值得(我的意思是指向数组的指针比数组多)?

谢谢

【问题讨论】:

  • 第二个是不正确的,因为你分配了 2500 字节而不是浮点数。
  • 具有 2500 个浮点数的系统听起来完全没有资源限制。如果你有 FPU 和那么多 RAM,那么你就有了一些高端 MCU。您需要浮点数的数学是什么?为什么需要 2500 个值?如果没有规范,这一切都没有意义,这一切是为了什么?通常,嵌入式系统中禁止堆分配。而 2500 个浮点数就是 2500 个浮点数,无论你如何分配它们。
  • @Lundin 无论你如何分配,2500 个浮点数都是 2500 个浮点数。这就是我要找的,所以最后,如果我在堆栈上分配或者我使用堆是一样的?当然,我必须使用 45000 个值,但我已经简化了问题。
  • 实际上,堆的存在意味着它窃取了您本可以用于其他用途的 RAM。堆大小不会在微控制器上神奇地重新增长。它被设置为一个固定值,这正是它将消耗多少 RAM,无论您是否使用它。这就是为什么通常的做法是从链接描述文件中删除所有称为堆的东西。
  • 堆栈大小可能受到限制。这取决于系统

标签: arrays c pointers embedded


【解决方案1】:

由于管理分配和解除分配所需的对齐和堆管理元数据,动态内存分配在内存使用方面的效率会稍低。

然而,更重要的问题是动态分配的不确定性。分配将花费可变的时间,并且可能会失败。静态分配的数组不需要时间并且保证可用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2016-02-03
    • 1970-01-01
    相关资源
    最近更新 更多