我正在使用 visual studio 2010 构建一个小项目,该项目声明一个 vector 并对接近 1500 条记录执行 push_back,其中有 6 个字符串成员变量。 Employee 的实例是通过传递在 cpp 文件中硬编码的字符串文字创建的。
示例代码:
struct Employee{
Employee(string && name, string && id, string && ssn, string && location, string && phone): name(move(name)), id(move(id)), ssn(move(ssn)), location(move(location)), phone(move(phone)){}
string name;
string id;
string ssn;
string location;
string phone;
};
int main (int argc, char *args[]){
vector<Employee> ec;
ec.push_back(Employee(string("Sam"), string("sam"), string("215559999"), string("Seattle"), string("2145482058")));
ec.push_back(Employee(string("Adams"), string("ada"), string("124558888"), string("Pittsburgh"), string("6545482058")));
/*push_back 1500 records*/
}
此代码在 Debug模式下编译和链接良好。在 Release模式下,代码编译得很好,但需要很长时间才能链接。输出控制台的最后两行是
1>链接:
1>生成代码
PS:从发布默认值“Maximize Speed/O2”禁用优化(属性 > C/C++ > 优化)解决了这个问题,但我不想考虑这个问题,除非真的没有其他办法。
编辑: 文件 IO 不是我们能接受的,因为它会增加处理的轻微延迟,特别是因为此代码将同时在 100 个作业中启动。因此,鉴于这是一个 30x4000 的静态表,我们缩小了内存表的范围,并避免了由于 io.load 导致的加载延迟。硬编码肯定会让代码看起来更像一个文本文件,但我们追求的是性能。 那么,Visual Studio 有什么方法可以接受字符串文字的硬编码,并快速链接它们。如果没有,我将回到我的文件 io 方法。
最佳答案
考虑到您的文字都是文字,我会坚持只使用 const char*
成员。所有那些在启动时调用的构造函数,所有调用 strlen
都不是高效的。这也消除了 12.000 个临时变量,这对编译器来说是一种解脱。
此外,对该 vector 调用 reserve
。
[编辑]
避免在启动时调用 strlen
的常用技术是将字符串作为 const char (&str)[N]
传递并使用模板参数推导来获取字符串长度 N。在在这种特殊情况下,编译器已经受到影响(28 分钟),因此添加模板很可能会使情况变得更糟。您必须使用实际的编译器对其进行分析。特别是,您可能需要一个包装器来防止 Employee::Employee
被实例化为每个可能的字符串长度组合。
template<size_t N> inline std::string make_string(const char (&str)[N])
{
return std::string(static_cas<const char*>(str), N);
}
关于c++ - 使用太多字符串文字时,Visual Studio 2010 需要永远链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18992923/