c++ - 在 Visual Studio 2010 中使用大型查找表的代码库链接器的局限性

标签 c++ visual-studio-2010 visual-studio-2012 linker data-analysis

在我的工作中,我们有各种大型表来存储用于一组多维非参数模型的数据。每个表都是一个 float 数组,其大小通常为 200,000 到 5,000,000 个元素。

今天,当我发现项目的编译和链接导致 Microsoft 增量链接器停止工作,我以前没见过的东西。请注意,我正在更新的表的大小从大约 290,000 个元素增长到每个接近 10,000,000 个元素。

我搜索并找到了人们推荐的解决增量链接器弹出窗口问题的方法,但没有解决它。我什至接受了该项目并将其集成到 VS 2012 中,但也失败了。

我知道我的项目以前编译过,所以我删除了更新并将其恢复到原来的状态。此状态一如既往地正确编译和链接。然后我将其中一张旧表与其中一张新表交换,并正确编译和链接。但是,一旦我对更新的表进行了另一次交换,它在编译后的链接也遇到了同样的问题。

如前所述,我添加的新表每个都有大约 10,000,000 个元素,并且比它们正在更新的旧表大得多。链接器正在努力处理这些大表是否可行?如果是这样,那是为什么?

新表在代码库中编译得很好,只是链接器步骤失败了。如果表的大小是一个问题,是否有任何建议来处理这个问题,仍然允许保持名义建模和查找表方法?我确实认识到从大小的角度来看使用参数模型会更好,因为它会压缩数据,但我的团队目前不想放弃他们的传统方法。

请注意,每个表的代码大致如下:

头文件

// 
// dataset1.hpp
//

#ifndef dataset1_hpp_
#define dataset1_hpp_

namespace set1 {
   extern const int tableSize;
   extern const float table[];
}

#endif

源文件

//
// dataset1.cpp
//

namespace set1 {
   extern const int tableSize = 10000000;
   extern const float table[tableSize] = {
   /*... Lots of Numbers ... */
   };
}

最佳答案

在您的 .cpp 文件中,您将数据定义为 extern。为什么?数据是此 .cpp 文件的本地数据。这对我来说很奇怪。也许你需要:

//
// dataset1.cpp
//

namespace set1 {
   const int tableSize = 10000000;
   const float table[tableSize] = {
       /*... Lots of Numbers ... */
   };
}

我不确定这是否有帮助,但值得一试。也许您会简单地绕过这个问题。

在我过去的工作中,我遇到了巨大的对象静态数组问题(编译器在处理来自大量顺序 ctors 的可能异常时遇到了问题),但除此之外,巨大的静态数组工作正常。

您为什么使用 VS2010?至少尝试最新版本(免费 Community 2015)以检查会发生什么。

关于c++ - 在 Visual Studio 2010 中使用大型查找表的代码库链接器的局限性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900092/

相关文章:

c++ - 将 int32 重新解释为 float

c++ - 看不到我的第一个窗口应用程序

c++ - Visual Studio 不会在配置管理器中给我 64 位的平台选项..?

visual-studio-2012 - 如何使 Visual Studio 窗口在事件时突出显示?

visual-studio - ReSharper 6.1 是否适用于 Visual Studio 2012?

asp.net-mvc - User.Identity.Name 在 Visual Studio 中返回空

c++ - 创建 std::shared_ptr 以分配成员变量时内存泄漏

c++ - 与迭代相比,为什么我的二进制搜索如此慢?

c++ - 从 cin 获取输入并将其存储在 char 变量中

c++ - 构建项目时出现链接器错误