带有 -O3 警告的特征:参数 1 值“X”超过最大对象大小 Y
Eigen with -O3 warning: argument 1 value ‘X’ exceeds maximum object size Y
会发生什么
当我按照教程 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
什么触发了警告
- 警告仅在使用
Vector2f
、Vector3f
等时显示。对于 Matrix2f
、Matrix3f
等类型不显示
- 每当我启用
-O[1-3]
时都会显示警告,而 -O0
则不会出现
更多信息:
This question 似乎是相关的,但我看不出它对我有什么帮助。
我已经为每个想要现成运行示例的人做了一个小示例。你可以在我的 GitHub.
上找到它
有没有人知道这里可能出了什么问题?
在文件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-07,并且应该在 Eigen 3.3.6 中可用。
会发生什么
当我按照教程 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
什么触发了警告
- 警告仅在使用
Vector2f
、Vector3f
等时显示。对于Matrix2f
、Matrix3f
等类型不显示 - 每当我启用
-O[1-3]
时都会显示警告,而-O0
则不会出现
更多信息:
This question 似乎是相关的,但我看不出它对我有什么帮助。
我已经为每个想要现成运行示例的人做了一个小示例。你可以在我的 GitHub.
上找到它有没有人知道这里可能出了什么问题?
在文件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-07,并且应该在 Eigen 3.3.6 中可用。