1

我有一个函数可以检查模式是否在提供的字符串内。该模式是预定义的,并且有很多可用,例如:

  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

   }

所以我怀疑创建一个表示predefstrings(a1到an)的枚举并将它们传递给函数并在switch case或其他地方分配“apple”“orange”值的更好方法。这种方法会比在构造函数中初始化使用更少的内存吗?

4

3 回答 3

2

我不太确定我是否了解您想要优化的内存,这里。

假设它是实际成员,并且它们的类型确实是const char*,这些字符串只是指向编译时常量的指针。这些常量将(很可能)放置在堆栈或堆之外的某个常量内存区域内,并且仅在任何执行开始之前通过将程序加载到内存中“初始化”。因此,实际上没有任何内存使用可供您优化,因为字符串需要存储在程序生成的二进制文件中的某个位置。

因此,您实际用于此类实例的唯一内存是每个字符串的单个指针。如果这些指针对于每个实例都是相同的,则可以将它们设为static,这更清楚地表明了意图。如果它们在对象之间确实存在差异,则无法进行优化。在任何一种情况下,这都是如此少量的内存,它不应该有任何影响,而且您很可能正在考虑过早的优化。

于 2013-01-16T12:53:59.467 回答
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,而不会浪费任何内存。

于 2013-01-16T12:50:49.593 回答
0

不,无论哪种方式,您都需要字符串常量。

于 2013-01-16T12:39:51.440 回答