2014-06-19 4 views
15

मेरी प्रोजेक्ट में मैंने इस्तेमाल किए गए पॉइंट प्रकार को Eigen::Vector2f से Eigen::Vector2d में बदल दिया और संरेखण समस्या में भाग गया।std :: vector के आवंटक को बदलते समय प्रारंभकर्ता सूची क्यों उपलब्ध नहीं हैं?

#include <vector> 
#include <Eigen/Eigen> 

int main() 
{ 
    std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} }; 
} 

मैं निम्नलिखित रन टाइम त्रुटि हो रही है::

यहाँ कोड का एक सरलीकृत संस्करण है

eigen3/Eigen/src/Core/DenseStorage.h:78: Eigen::internal::plain_array<double, 2, 0, 16>::plain_array() [T = double, Size = 2, MatrixOrArrayOptions = 0, Alignment = 16]: Assertion `(reinterpret_cast<size_t>(array) & 0xf) == 0 && "this assertion is explained here: " "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalignedArrayAssert.html" " **** READ THIS WEB PAGE !!! ****"' failed. 

के रूप में ज़ोर-संदेश का सुझाव दिया, मैं आवश्यक alignment of Fixed-size vectorizable Eigen objects के बारे में पढ़ा । और STL Containers के उपधारा भी। और ऐसा लगता है जैसे मैं दो विकल्प हैं:

  1. उपयोग Eigen::aligned_allocator
  2. या का उपयोग EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION मैक्रो।

दोनों प्रयास संकलित नहीं करते हैं (जीसीसी 4.8.3 और क्लैंग 3.5 के साथ परीक्षण) क्योंकि संकलक प्रारंभकर्ता सूची को सही ढंग से परिवर्तित करने में सक्षम नहीं है।

यहाँ बदल कोड:

#include <vector> 
#include <Eigen/Eigen> 
#include <Eigen/StdVector> 
// EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Eigen::Vector2d) 

int main() 
{ 
    std::vector<Eigen::Vector2d, Eigen::aligned_allocator<Eigen::Vector2d>> points = { {0,0}, {0,1} }; 
    // std::vector<Eigen::Vector2d> points = { {0,0}, {0,1} }; 
} 

जीसीसी त्रुटि उत्पादन:

error: could not convert ‘{{0, 0}, {0, 1}}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<Eigen::Matrix<double, 2, 1>, Eigen::aligned_allocator<Eigen::Matrix<double, 2, 1> > >’ 

तो मैं सोच रहा हूँ: उपलब्ध नहीं

  • क्यों हैं प्रारंभकर्ता सूचियों जब संभाजक बदलते std::vector का?

    • क्या यह संरेखण की वजह से है?
    • क्या मैं किसी भी तरह प्रारंभकर्ता सूची को संरेखित कर सकता हूं?
  • विशेषज्ञता संस्करण क्यों विफल रहा है?

    • क्या इन्हें प्रारंभकर्ता सूची सुविधा की कमी है?

उत्तर

15

का अध्ययन Eigen/StdVector फ़ाइल को शामिल करने के बाद (यह Eigen/src/StlSupport/StdVector.h line 68 of version 3.2.1 में है सटीक होना करने के लिए), ऐसा लगता है कि समस्या यह हेडर फाइल के भीतर std::vector के एक आंशिक टेम्पलेट विशेषज्ञता से निकलती है। जैसे ही आप Eigen::aligned_allocator आवंटक के रूप में उपयोग करते हैं, इस आंशिक टेम्पलेट विशेषज्ञता एसटीएल vector को प्रतिस्थापित करती है। और इस विशेषज्ञता में सी ++ 11 फीचर्स की कमी है।

विस्तार में क्यों इस विशेषज्ञता संभाजक की जगह से अलग आवश्यक है: सी ++ 11 से पहले std::vector की resize function नव निर्मित तत्वों प्रारंभ करने में मूल्य द्वारा एक अतिरिक्त पैरामीटर लग सकता है। According to the Eigen3 Documentation मूल्य द्वारा पैरामीटर पास करने से किसी भी संरेखण संशोधक को त्याग दिया जाता है और इसका उपयोग निश्चित आकार वेक्टरिज़ेबल ईजिन ऑब्जेक्ट्स (सिमड देखें) के साथ नहीं किया जा सकता है।

संपादित करें: कुछ और परीक्षण करने के बाद मुझे एहसास हुआ कि std::vector की सी ++ 11 कार्यान्वयन ऊपर कहा गया है मुद्दा नहीं है। तो संरेखण समस्या को हल करने के लिए आप केवल को Eigen::aligned_allocator भरने की आवश्यकता है। लेकिन Eigen/StdVector शामिल नहीं है। इस फ़ाइल को शामिल करने से आपको std::vector के C++ 11 कार्यान्वयन का उपयोग करने से रोका जाएगा क्योंकि यह हेडर आवंटन के रूप में Eigen::aligned_allocator के साथ आंशिक विशेषज्ञता को परिभाषित करता है।

संबंधित मुद्दे