【发布时间】:2017-08-22 11:14:33
【问题描述】:
我有一个 20k 已知字符串的列表,我在编译时就知道并且永远不会改变。一种不可配置的字典。我不想在运行时从文件中加载它,因为这意味着很多不必要的架构:在某个路径中查找文件、指示路径的配置文件等。
我在 C++ 中想出了一个这样的解决方案:
在 a.cpp 中:
std::vector<std::string> dic;
dic.reserve(20000);
#define VECTOR_DIC_ dic;
#include values.inl
#undef VECTOR_DIC_
然后在 values.inl 中,包含 20k 个 push_back 调用的列表,如下所示:
VECTOR_DIC_.push_back("string1");
VECTOR_DIC_.push_back("string2");
...
VECTOR_DIC_.push_back("string20000");
此代码在 Debian 上与 gcc-4.8 一起编译并正常工作,但无法与 gcc-4.4 一起编译,gcc-4.4 永远无法完成对 a.cpp 文件的编译。
为什么 gcc-4.4 不支持这种大型初始化?另外,有没有一种设计模式可以在编译时对已知值进行如此大的初始化?
【问题讨论】:
-
您应该将其存储为
const char *S[],然后从S构造dic- 这将允许您将dic构造为const向量,而无需依赖初始化功能。例如。 godbolt.org/g/REZdds -
@JordiAdell 如果在编译时完成,我会感到惊讶......
-
@JordiAdell 即使有一个编译器可以做到这一点(我不这么认为)它也不是你可以依赖的可移植优化
-
std::vector在其实现中依赖于动态分配,编译器几乎不可能在编译时解决这个问题。为此使用向量会浪费内存(无缘无故地将文字复制到动态分配的内存中)和时间;只需使用普通数组(或者,如果您真的需要向量,请将其设为std::vector<const char *>,至少您不会复制字符串数据)。 -
...或使用
std::array<const char*, N>。
标签: c++ gcc vector initialization gcc4.4