gpt4 book ai didi

c++ - 调整结构/字符数组的大小(以减少内存使用)

转载 作者:行者123 更新时间:2023-11-27 23:40:16 24 4
gpt4 key购买 nike

这是我在 Arduino/C++/ESP32 上的第一个项目。我写了一个相当大的程序,几乎所有的东西都能正常工作——除了最后我意识到设备会周期性地耗尽呼吸(内存)并重新启动。重新启动是因为我配置了一个看门狗来这样做。

有一个领域我认为有机会减少内存使用,但我在 c++ 上的经验“还没有”让我能够自己编写这个。请问有什么指点(没有双关语)吗?从昨天开始我就一直在做这个,摆脱一个错误只会导致另一个新的错误弹出。此外,我不想想出一些 hacky 或以后可能会破坏的东西。对于这里有经验的人来说,这应该是一个快速的答案。

让我解释一下我更喜欢重构/优化的代码。

我需要存储一堆我以后需要阅读/操作的记录。我在全局范围内声明了一个结构(因为它们是相关字段)。现在的问题是我可能需要存储 1 条记录、2 条记录或 5 条记录,这些记录只有在我从 EEPROM 中读取数据后才会知道。这必须是所有函数都可以访问的,所以它必须是一个全局声明。

总结

问题一 - 从 eeprom 读取数据后,如何在程序中稍后设置“NumOfrecs”。

问题2 - char 数组用户名的大小(sizeOfUsername)也可以根据从 eeprom 读取的用户名长度而改变。有时它可能是 5 个字符长,有时可能是 25 个字符。我可以将它设置为最大 25 并解决这个问题,但是如果许多用户名只有 4-5 个字符长,我不会浪费内存吗?所以简而言之 - 就在将 eeprom 中的数据复制到“用户名”字符数组之前,是否可以将其大小设置为保存该数据所需的最佳大小(即数据大小 + 1 字节用于空终止)。

struct stUSRREC {
char username[sizeOfUsername];
bool online;
};

stUSRREC userRecords[NumOfrecs];

我熟悉了一大堆函数,如 strcpy、memset、malloc 等,但现在我的时间不多了,需要再继续学习。

我可以尝试以稍微不同的方式执行此操作,其中我不使用结构,而是使用单独的 char 数组(对于每个字段,如 username )。但话又说回来,当我从 eeprom 读取数据时,我将不得不调整数组的大小。

我可以解释我尝试过的所有事情,但这会使这个问题变得不必要地冗长,并可能导致失去一些清晰度。非常感谢任何帮助。

在回复关于 SO 的问答时,我尝试了一些随机的东西,至少下面的这段代码似乎有效(在存储更小/更大的值方面)
struct stUSRREC {
char username[];
bool online;
};

stUSRREC userRecords[5];

然后以这种方式操作它
strcpy(userRecords[0].username, "MYUSERNAME");
strcpy(userRecords[0].username, "test");
strcpy(userRecords[0].username, "MYVERYBIGUSERNAME");

我已经能够写/重写不同的长度(上图)并且可以正确地读回所有的长度。调整“userRecords”的大小可能是一个不同的游戏,但可以稍等片刻

我忘记提到的一件事是我只需要一次调整数组的大小/调整大小(持有用户名)。在 setup()本身我可以将所需的数据读取/加载到这些数组中。我不确定这是否会带来任何其他可能性。在运行期间我需要操作的其余结构/数组只是 bool 值和 int 值。这根本不是问题,因为这样做不需要调整大小。

在旁注中,我很确定我不是唯一一个面临这种情况的人。任何提示/线索/指针都可能对其他人有所帮助。当你真正开始用一堆东西加载它们时,像 ESP32 这样的小设备上的限制变得更加明显。我使用“Strings”(大写的 S)进行了所有工作,但定期重启(cpu 饥饿?)要求我摆脱 Strings。即便如此,我听说使用字符串(在 ESP、Arduino 和 gang 上)是个坏主意。

最佳答案

您将此问题标记为 C++,所以我会问:

可以用vector吗和 string在您的嵌入式代码中?

#include <string>
#include <vector>

struct stUSRREC {
std::string username;
bool online;
stUSRREC(const char* name, bool isOnline) :
username(name),
online(isOnline)
{
}
};

std::vector<stUSRREC> userRecords;

使用 string因为用户名类型意味着您只分配保留名称所需的尽可能多的字符,而不是分配假定的最大大小 sizeOfUsername .使用 vector允许您动态增长您的记录集。

然后添加新记录:
stUSRREC record("bob", true);
userRecords.push_back(record);

你可能不需要 NumOfrecs了。 userRecrods.size() 涵盖了这些内容

关于c++ - 调整结构/字符数组的大小(以减少内存使用),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678021/

24 4 0
文章推荐: css - 使用
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com