我正在使用visual studio 2010来构建一个声明向量的小项目,并为接近1500条记录执行push_back,该记录有6个字符串成员变量。通过在cpp文件中传递硬编码的字符串文字来创建Employee的实例。
示例代码:
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*/
}
此代码在调试模式下编译和链接很好。在发布模式下,代码编译得很好,但需要永远链接。输出控制台的最后两行是
1 GT;链接:
1 GT;生成代码
PS:禁用优化(属性&gt; C / C ++&gt;优化),从发布默认值“最大化速度/ O2”,解决了问题,但这不是我想要考虑的事情,除非真的没有其他办法。
编辑: 文件IO不是我们感到满意的,因为它为处理添加了一点点延迟,特别是因为这个代码将立即在100个作业中启动。因此,假设这是一个30x4000的静态表,我们缩小了内存表的范围,并避免了由于io导致的加载延迟。硬编码肯定会使代码看起来更像文本文件,但我们正在寻找性能。 那么,Visual Studio是否有任何方法可以接受字符串文字的硬编码,并快速链接它们。如果没有,我会回到我的文件io方法。
答案 0 :(得分:3)
考虑到你的文字都是文字,我只坚持const char*
个成员。所有这些构造函数在启动时被调用,所有调用strlen
都无效。这也消除了12.000个临时工,这对编译器来说是一种解脱。
另外,请在该向量上调用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);
}