在课堂上,我想拥有一个由常数C字符串组成的常数数组:
.cpp
const char* const Colors::Names[] = {
"red",
"green"
};
.h
class Colors {
public:
static const char* const Names[];
};
该数组对于Colors类的所有实例都应该是公用的(即使我计划只包含一个实例,但它不应该使用方法),因此声明数组为静态。
要求是,如果未实例化类,则数组不应占用二进制文件中的任何内存。 但是,使用上述解决方案,它确实消耗:
.rodata._ZN6Colors5NamesE
0x00000000 0x8
不确定C字符串本身,因为无法在映射文件中找到它们,但是我认为它们也会占用内存。
我知道解决此问题的一种方法是使用constexpr和C ++ 17,不再需要在类外部定义静态constexpr成员。 但是,由于某些原因(例如,我的构建系统中的编译时间更长,并且程序内存占用量更大),我不想更改c ++标准版本。
另一种想法是删除静态对象(因为我仍然打算拥有一个实例)。但是,此解决方案的第一个问题是我必须指定数组大小,而我宁愿不这样做,否则会得到:
error: flexible array member 'Colors::Names' in an otherwise empty 'class Colors'
第二个问题是将数组放在RAM部分(类对象内部)中,而只有C字符串放在闪存中。
有人知道这个问题的其他解决方案吗?
PS。我的平台是Stm32 MCU,并使用GCC ARM编译器
编辑(以解决评论中的某些答案) 正如评论中所建议的,仅静态成员不能做到这一点。 因此,问题可能实际上应该是:如何创建(非静态)类数组成员,该成员放置在只读存储器(未初始化)中,仅当在程序中实际使用该类时,该成员才放置在存储器中并且最好是该类的所有实例都通用?数组本身仅在该类中使用。
一些背景信息: 假设数组的大小为256,每个C字符串为40个字符。数组的大小为1kB,C字符串的大小为10kB(32位架构)。类是库的一部分,供不同项目(程序)使用。如果该类未在该项目中使用,那么我不希望它(和它的数组)会占用一个字节,因为我需要将FLASH空间用于其他用途,因此压缩不是一种选择。
如果没有其他解决方案,那么我将考虑通过链接器删除未使用的段的可能性(尽管它一直希望有一个更简单的解决方案)。 感谢所有建议。