Собственный с предупреждением -O3: значение аргумента 1 'X' превышает максимальный размер объекта Y - PullRequest
0 голосов
/ 26 декабря 2018

Что происходит

Когда я пытаюсь добавить Eigen::Vector3f в std::vector после урока на веб-сайте Eigen , например:

#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;
}

Iполучите следующее предупреждение:

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

Дополнительная информация:

Этот вопрос , похоже, связан, но я не понимаю, как он мог бы мне помочь.

Я сделал небольшой пример для всех, кто хочет готовый пример.Вы можете найти его на моем GitHub .

У кого-нибудь есть идеи, что здесь может быть не так?

1 Ответ

0 голосов
/ 27 декабря 2018

В файле 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

Итак, похоже, что это связано с этой ошибкой GCC .

Насколько я вижу, исправление commit появилось в 2018-10-07 и должно быть доступно в Eigen 3.3.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...