Visual Studio 2017 发行版中的 Eigen cwisemin/cwisemax 访问冲突
Posted
技术标签:
【中文标题】Visual Studio 2017 发行版中的 Eigen cwisemin/cwisemax 访问冲突【英文标题】:Eigen cwisemin/cwisemax access violation in Visual Studio 2017 release build 【发布时间】:2017-03-22 14:24:13 【问题描述】:以下是一些示例代码,在使用 Visual Studio 2017 的 x86 发行版本时会导致访问冲突:
#include <Eigen\Core>
#include <iostream>
int main()
Eigen::Vector3i a(1,1,1);
Eigen::Vector3i b(10, 10, 10);
std::cout << a.cwiseMin(b) << std::endl;
return 0;
x64 似乎没有崩溃,但结果中的第一个值是错误的。调试构建工作,与所有使用 VS 15、MinGW 和 Linux gcc 的构建一样。
cwiseMax 具有相同的行为。这可能与https://***.com/questions/36928480/eigen-c-release-build-in-visual-studio有关
有人知道这个问题的解决方法吗?
【问题讨论】:
【参考方案1】:我看到了相同的结果,除了 vs2015 x86 发布版本也给我第一个值的错误结果。我想出的两个选项是:
-
关闭优化。 属性->C/C++->优化
将a.cwiseMin(b)
的结果存储在第三个变量中:
Eigen::Vector3i c(a.cwiseMin(b));
std::cout << c << std::endl;
【讨论】:
感谢您的反馈!关闭优化确实有效,但遗憾的是不是很可行,因为它会使大量计算太慢。虽然您的建议似乎适用于该示例,但如果您将常量值替换为变量Eigen::Vector3i a(i,i,i);
...
如果我用变量替换常量,我看不到我的问题,只要变量被初始化。 int i = 1; Eigen::Vector3i a(i, i, i);
【参考方案2】:
我遇到了同样的问题,并且也可以使用您的示例代码重现该问题。在我的情况下,通过指定EIGEN_DONT_VECTORIZE
preprocessor-define 禁用矢量化后问题消失了。如果您想保持启用矢量化,您可能需要检查内存对齐(因为启用时矢量化有更强的对齐要求)。
【讨论】:
以上是关于Visual Studio 2017 发行版中的 Eigen cwisemin/cwisemax 访问冲突的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2017 RC 下载 最新版本的发行说明
Visual Studio数据库版中的“数据库项目”和“服务器项目”之间有什么区别?
Visual Studio Team System 2008数据库版中是否提供了代码分析工具?
如何在 Visual Studio Team 版中按个人请求查看负载测试报告
CS1729 'MyNavigationPage' 不包含采用 1 个参数的构造函数 --> 在 Visual Studio 2019 社区版中