क्या होता है

जब मैं पर ट्यूटोरियल का अनुसरण करते हुए एक 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;
}

मुझे निम्नलिखित चेतावनी मिलती है:

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);

कैसे पुन: पेश करें

मैं उबंटू 18.04 पर हूं और मैंने Eigen 3.3.4 इंस्टॉल किया हुआ है।

आप इस प्रश्न में निम्न आदेश के साथ कोड बना सकते हैं यदि आपके पास निम्न आदेश के साथ Eigen स्थापित है:

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

क्या चेतावनी ट्रिगर करता है

  • चेतावनी केवल Vector2f, Vector3f, आदि का उपयोग करते समय दिखाई देती है। यह Matrix2f, Matrix3f, आदि जैसे प्रकारों के लिए नहीं दिखाई जाती है।
  • चेतावनी तब दिखाई जाती है जब मेरे पास -O[1-3] सक्षम होता है और -O0 के साथ ऐसा नहीं होता है

आगे की जानकारी:

यह सवाल ए> संबंधित प्रतीत होता है, लेकिन मुझे नहीं लगता कि यह मेरी मदद कैसे कर सकता है।

मैंने उन सभी के लिए एक छोटा सा उदाहरण बनाया है जो एक रेडी-टू-रन उदाहरण चाहते हैं। आप इसे मेरे GitHub पर पा सकते हैं।

क्या किसी के पास कोई विचार है कि यहां क्या गलत हो सकता है?

4
niosus 26 पद 2018, 17:00

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

तो, ऐसा लगता है कि यह इस GCC बग से जुड़ा है।

जहां तक ​​मैं देख सकता हूं, इसे ठीक करने वाली प्रतिबद्ध 2018-10-07 को दिखाई दी , और Eigen 3.3.6 में उपलब्ध होना चाहिए।

3
lisyarus 27 पद 2018, 19:36