我有一个函数可以检查模式是否在提供的字符串中。该模式是预定义的,并且有很多可用的模式 例如:
const char* a1 = "apple";
const char* a2 = "Orange";
const char* a3 = "mango";
const char* a4 = "grapes";
...
...
...
const char* an = "Banana";
PS:a1,a2,a3都是类FRUIT的成员变量。值赋值在构造函数中完成。我有这个功能:
void FindPattern(sample_String, predefined_string)
{
if(strstr(sample_string,predefined_string))
{
do sth...
}
else
do another thing
}
所以我怀疑它是一个更好的方法来创建一个枚举,表示预定义字符串(a1到a)并将它们传递给函数,并在switch case或者在本地分配“apple”“orange”值。这种方法会比在构造函数中初始化使用更少的内存吗?
答案 0 :(得分:2)
我不太清楚我在这里了解你要优化的内存。
假设它是实际成员,并且它们的类型确实是const char*
,这些字符串只是编译时常量的指针。这些常量(很可能)将被放置在堆栈或堆外部的某个常量内存区域内,并且只有在执行开始之前将程序加载到内存中才会“初始化”。因此,优化没有任何内存使用,因为字符串需要存储在某处的程序生成的二进制文件中。
因此,您实际用于此类实例的唯一内存是每个字符串一个指针。如果这些指针对于每个实例都是相同的,那么你可以使它们static
,这更清楚地表明了意图。如果它们在对象之间确实存在差异,则无法进行优化。在任何一种情况下,这是一个很小的内存,它不会产生任何影响,你很可能会看到过早的优化。
答案 1 :(得分:0)
没有。无论哪种方式都需要字符串常量。
答案 2 :(得分:0)
如果所有实例共享同一组a1,a2,...,an
并且在构造函数中设置它们之后永远不会更改它们,那么最好让它们成为static
成员Fruit
,像这样:
class Fruit {
static const char* const a1;
static const char* const a2;
//...
static const char* const an;
};
// In Fruit.cpp:
static const char* const Fruit::a1 = "apple";
static const char* const Fruit::a2 = "orange";
//...
static const char* const Fruit::an = "banana";
所有实例将共享成员a1,a2,...,an
,而不会浪费任何内存。