3

我正在使用 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*/
}

此代码在调试模式下编译和链接良好。在发布模式下,代码编译得很好,但链接需要很长时间。输出控制台的最后 2 行是
1>Link:
1> Generate code

PS:从“Maximize Speed /O2”的发布默认值禁用优化(属性> C / C ++>优化)解决了这个问题,但这不是我想要考虑的事情,除非真的没有其他办法。

编辑:文件 IO 不是我们喜欢的东西,因为它增加了进程的轻微延迟,特别是因为这段代码将同时在 100 多个作业中启动。因此,鉴于这是一个 30x4000 的静态表,我们缩小了内存表的范围,并避免了由于 io. 硬编码肯定会让代码看起来更像一个文本文件,但我们正在寻找性能。那么,Visual Studio 有什么方法可以接受字符串文字的硬编码,并快速链接它们。如果没有,我会回到我的文件 io 方法。

4

1 回答 1

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);
} 
于 2013-09-25T07:34:52.410 回答