c++ - 使用太多字符串文字时,Visual Studio 2010 需要永远链接

标签 c++ visual-studio-2010 visual-studio linker

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

相关文章:

visual-studio - 在 Visual Studio 的对象监 window 口中搜索文本

visual-studio - 在 Visual Studio C++ (Win32) 项目中同步版本资源

c++ - GCC 和 MSVC 之间的 digits10 差异

c++ - C++中的隐式转换

c++ - MFC CListCtrl::SetItemText() 不工作

.net - 当TF10167出现时VSTS发生了什么?怎么解决呢?

c++ - 编写完一个游戏后,如何绑定(bind)可执行文件中的 Assets 并打包,以便分发给其他人?

c++ - 参数列表中的模板方法 "=0"

在 Visual Studio 10 中使用 OpenCL 的 C++/CLI

visual-studio - TFS 常量错误输出 TF10121 : The path '' is not found or not supported. 键入或选择其他路径