c++ - 字符串池/实习——这是好的做法吗?

标签 c++

例如,我有一个类,我在二进制文件中存储了一些有关的信息:

class car {
    char car_manufacturer;
    //other stuff
};

car_manufacturer 的值是以下值之一:

enum car_manufacturers : char {
    VOLVO = 0,
    AUDI,
    MERCEDES
};

现在在这个示例应用程序中,用户需要他们的汽车制造商的字符串表示而不是数字,因此我创建了一个数组,其中包含枚举的字符串表示 ,其中数组的顺序与枚举,所以 car_manufacturer 可以用作数组索引

std::string car_manufacturers_strings[MERCEDES + 1] = {
    "Volvo",
    "Audi",
    "Mercedes"
};

现在加载文件并从数据中创建一个 car 对象后,我可以简单地通过 car_manufacturers_strings[car.car_manufacturer]; 获取汽车的品牌,作为一个字符串;

这样做的好处是,如果汽车是同一品牌,我就不必在文件中存储一堆重复的字符串,这样我就可以节省很多空间。但这样做的缺点是代码稍微复杂一些。

那么这是好事还是坏事?

最佳答案

这是将枚举器的字符串表示形式提供为数组的非常标准的做法。

有一点是:

std::string car_manufacturers_strings[MERCEDES + 1] = {
    "Volvo",
    "Audi",
    "Mercedes"
};

将字符串文字存储在二进制文件中,并在动态初始化阶段创建这些文字的拷贝作为 std::string 对象。

您可能希望将其更改为:

char const* const car_manufacturers_strings[MERCEDES + 1] = {
    "Volvo",
    "Audi",
    "Mercedes"
};

这样它就不会不必要地创建这些拷贝。

关于c++ - 字符串池/实习——这是好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25621804/

相关文章:

C++ ifstream 不会打开任何文件

c++ - 在我的运行时cuda程序中,cpu和gpu可以异步计算,但不能协同计算,为什么?

c++ - 如何让Flycheck(使用clang_complete)识别Mojave上的OpenGL框架

c++ - CMake 找不到源文件

c++ - 我可以更改 QT 中主应用程序的图标大小吗?

c++ - OBB 和圆之间的二维碰撞检测数学

c++ - 如何修改 CMakelists for Qt5 从 Windows 到 Linux?

c++ - 在 C++ 中从控制台获取触发器

c++ - 努力获取 char* 中的字符数

c++ - 编译 clang-llvm 示例