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 2012 的 TCC

Visual Studio数据库版中的“数据库项目”和“服务器项目”之间有什么区别?

Visual Studio Team System 2008数据库版中是否提供了代码分析工具?

如何在 Visual Studio Team 版中按个人请求查看负载测试报告

CS1729 'MyNavigationPage' 不包含采用 1 个参数的构造函数 --> 在 Visual Studio 2019 社区版中