【问题标题】:Eigen with -O3 warning: argument 1 value ‘X’ exceeds maximum object size Y带有 -O3 警告的特征:参数 1 值“X”超过最大对象大小 Y
【发布时间】:2018-12-26 14:00:10
【问题描述】:

会发生什么

当我尝试按照教程on Eigen website 像这样将Eigen::Vector3f 添加到std::vector 中时:

#include <Eigen/Core>
#include <Eigen/StdVector>
#include <iostream>

template <class EigenT>
using EigenStdVector = std::vector<EigenT, Eigen::aligned_allocator<EigenT>>;

int main() {
  EigenStdVector<Eigen::Vector3f> vec;
  vec.emplace_back(1.0f, 1.0f, 1.0f);
  std::cerr << vec.back().transpose() << std::endl;
  return 0;
}

我收到以下警告:

In file included from /usr/include/eigen3/Eigen/Core:349:0,
                 from /home/igor/Code/eigen_example/example.cpp:3:
In function ‘void* Eigen::internal::aligned_malloc(std::size_t)’,
    inlined from ‘void std::vector<_Tp, _Alloc>::_M_realloc_insert(std::vector<_Tp, _Alloc>::iterator, _Args&& ...) [with _Args = {float, float, float}; _Tp = Eigen::Matrix<float, 3, 1>; _Alloc = Eigen::aligned_allocator<Eigen::Matrix<float, 3, 1> >]’ at /usr/include/eigen3/Eigen/src/Core/util/Memory.h:742:76:
/usr/include/eigen3/Eigen/src/Core/util/Memory.h:159:12: warning: argument 1 value ‘18446744073709551612’ exceeds maximum object size 9223372036854775807 [-Walloc-size-larger-than=]
     result = std::malloc(size);

如何重现

我在 Ubuntu 18.04 上并安装了 Eigen 3.3.4

如果您使用以下命令安装了 Eigen,则可以使用以下命令构建此问题中的代码:

g++ -I/usr/include/eigen3 -O3 example.cpp

触发警告的原因

  • 警告仅在使用Vector2fVector3f等时显示。对于Matrix2fMatrix3f等类型不显示。
  • 每当我启用-O[1-3] 时都会显示警告,而-O0 不会发生

更多信息:

This question 似乎是相关的,但我不明白它对我有什么帮助。

我为每个想要一个可立即运行的示例的人制作了一个小示例。你可以在我的GitHub找到它。

有人知道这里可能出了什么问题吗?

【问题讨论】:

  • 那个值是 2^64-4,这肯定是相关的。
  • 您使用的是什么版本的 Eigen? (签入/usr/include/eigen3/Eigen/src/Core/util/Macros.h)你能给出一个单行编译器命令,而不是CMakelist吗? (使用VERBOSE=1 构建)
  • @chtz 我已经更新了这个问题。为简单起见,此处将相关信息加倍。 Eigen 版本:3.3.4,构建代码以重现此代码的命令:g++ -I/usr/include/eigen3 -O3 example.cpp

标签: c++ memory eigen gcc-warning eigen3


【解决方案1】:

在文件Eigen/src/Core/util/Memory.h中执行Eigen::aligned_allocator可以找到这些行:

#if EIGEN_COMP_GNUC_STRICT && EIGEN_GNUC_AT_LEAST(7,0)
// In gcc std::allocator::max_size() is bugged making gcc triggers a warning:
// eigen/Eigen/src/Core/util/Memory.h:189:12: warning: argument 1 value '18446744073709551612' exceeds maximum object size 9223372036854775807
// See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87544
size_type max_size() const {
  return (std::numeric_limits<std::ptrdiff_t>::max)()/sizeof(T);
}
#endif

所以,这似乎与this GCC bug有关。

据我所知,修复此问题的 commit 出现在 2018 年 10 月 7 日,应该在 Eigen 3.3.6 中可用。

【讨论】:

    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 2014-06-03
    • 2016-05-07
    • 2020-05-28
    • 1970-01-01
    • 2013-04-17
    • 2021-06-15
    • 1970-01-01
    相关资源
    最近更新 更多