2016-02-12 3 views
6

मैं एक कैश सीमा पर अपने प्रकार overalign करना चाहते हैं, तो मैं alignas प्रयोग किया है:alignas सम्मान कीवर्ड शायद

struct alignas(64) W { }; 

यह ठीक संकलित करता है। लेकिन फिर भी, मेरे आश्चर्य करने के लिए, जब मैं W रों का एक समूह को आवंटित करने का प्रयास करते हैं, वे 64-बाइट गठबंधन नहीं कर रहे हैं, लेकिन वास्तव में 16-बाइट गठबंधन:

#include <iostream> 
#include <iomanip> 
#include <unordered_map> 

struct alignas(64) W { }; 

int main() { 
    std::unordered_map<int, int> offset; 

    for (int i = 0; i < 1000; ++i) { 
     auto w = new W; 
     offset[(uintptr_t)w % 64]++; 
    } 

    for (const auto& p : offset) { 
     std::cout << p.first << ' ' << p.second << '\n'; 
    } 
} 

पैदावार:

0 250 
16 250 
32 250 
48 250 

पर कई संकलन (जीसीसी 4.8.2, जीसीसी 5.2.0, क्लैंग 3.7.1)। क्या हो रहा है? मैंने इसे संरेखित करने के लिए कहा, यह संरेखित क्यों नहीं है?

+5

["यह क्रियान्वयन-परिभाषित है कि अति-संरेखित प्रकार समर्थित हैं (\ [basic.align \])।"] (Http://eel.is/c++draft/expr.new#1)। यह भी देखें [सीडब्ल्यूजी मुद्दा 2130] (http://wg21.link/cwg2130)। –

+1

@ टी.सी. ऐसा लगता है कि यह एक जवाब होना चाहिए। – NathanOliver

+0

@ टी.सी. मुझे कैसे पता चलेगा कि एक कार्यान्वयन इसका समर्थन करता है (स्पष्ट रूप से न तो जीसीसी और न ही झुकाव) – Barry

उत्तर

3

यह अच्छी तरह से जवाब यहां है: https://stackoverflow.com/a/16510895

असल: new (कम से कम अपनी सामान्य उपयोग में) केवल new के लिए हर कॉल के लिए एक निरंतर अधिकतम संरेखण (alignof(std::max_align_t)) की गारंटी देता है।

2

दूसरा उत्तर इस अर्थ में सही है कि यह मौजूदा सीमा बताता है, लेकिन मैं यह इंगित करना चाहता हूं कि चीजें बेहतर होने वाली हैं।

जैसा कि टी.सी. द्वारा दर्शाया गया है। टिप्पणियों में, यह भाषा में एक लंबी खड़ी कमी थी। इसे looks जैसे the WG effort को ठीक करने के लिए सी ++ 17 में एक संकल्प हुआ है (जिसने अभी फीचर-पूर्ण स्थिति प्राप्त की है)। इस प्रकार, उस मानक को संकलित करते समय new के नए std::align_val_t ओवरलोड का उपयोग करके गतिशील आवंटन द्वारा ओवरलैगमेंट का अंततः सम्मान किया जाएगा। इस प्रकार बैरी की समस्या को हल करना!

नए मचान की राशि की आवश्यकता, मुझे लगता है इस मानक के पिछले संस्करणों में बैकपोर्ट नहीं किया जाएगा, ताकि वर्ष चेतावनी उनके गतिशील आवंटन केवल मौलिक संरेखण होने शायद सच ही रहेगा प्रकार के लिए sufficing के बारे में देखते हुए।

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