在编译时存储默认值的优雅而有效的方法
Elegant and efficient way to store default values at compile time?
编辑:我现在明白是怎么回事了。我得到的想法,类和它的实例化是在RAM中复制的事实,当我添加一个字符(一个字节)到其中一个标签(改变"白牡蛎孵化"到"白牡蛎孵化x"),Arduino IDE告诉我,2个字节被动态内存使用,所以我假设一个是类,另一个用于安装。
结果是,由于某种原因,string .h中的字符串似乎每次分配2个字节,因此一个字符串的大小为2,两个字符串的大小为2,三个字符串的大小为3,以此类推。大小以偶数增长
当然,现在我意识到类被存储在Arduino程序(EPROM)中,并且实例化在RAM中,因此数据并没有真正在RAM中复制。
原问题如下:我正在为Arduino (atmega328)编写一个程序,其中一个蘑菇温室将被控制。在蘑菇发育的不同阶段,温度和湿度参数应该有几个剖面。我想在编译时保存这些配置文件,然后在配置文件之间进行Arduino更改,以采取相应的行动。我想到了这个:
class GrowingProfile
{
private:
int idealTemp;
int idealHumi;
String label;
public:
GrowingProfile(int idealTemp,int idealHumi, String label)
{
this->idealTemp = idealTemp;
this->idealHumi = idealHumi;
this->label = label;
};
//general methods
};
class mushroomSpecies1Profiles
{
public:
GrowingProfile incubationProfile;
GrowingProfile fruitingProfile;
WhiteOysterGrowingProfiles():
incubationProfile (100, 95, "White Oyster Incubation"),
fruitingProfile (20, 4, "White Oyster Fruiting"){}
};
然后,在主代码中,让一个mushroomSpecies1Profiles实例将其成员作为参数传递给确定环境条件(在配置文件中设置)是否良好的方法。
然而,在我看来,这是臃肿的,因为在类定义中有效地复制了数据,然后在实例化中复制了数据。考虑到所讨论的微控制器只有2K的内存……在最终可执行文件中避免数据重复的好方法是什么?如果它是c#中的静态类?假设您的类GrowingProfile确实是恒定不变的,我将推荐以下内容:
static const GrowingProfile incubationProfile (100, 95, "White Oyster Incubation");
static const GrowingProfile fruitingProfile (20, 4, "White Oyster Fruiting");
字符串字面值是程序的一部分,如果在程序中定义(以任何方式)。为了避免这些字面值的内存消耗,您可以将它们放在一个单独的文件中,在访问该文件时承担映射字面值的成本(例如:通过整数键)。
然而,如果程序和文件系统位于同一个有限的EPROM中,你就完蛋了。你必须尽可能简短。
相关文章:
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法