2011-12-02 11 views
7

को परिभाषित करते समय मुझे संरेखण मान कैसे मिल सकता है यदि मेरे पास हेडर फ़ाइलों में सी स्ट्रक्चर परिभाषा तक पहुंच है, लेकिन hsc2hs जैसे कुछ उपयोग किए बिना मैन्युअल रूप से मेरे स्टेलेबल इंस्टेंस को परिभाषित करना चाहते हैं, तो मैं संरेखण मान कैसे प्राप्त करूं?एक स्टेरियल इंस्टेंस

क्या गलत संरेखण मूल्य भी क्रैश का कारण बन सकता है या प्रदर्शन को प्रभावित कर सकता है?

उत्तर

4

जीसीसी के साथ, आप __alignof__ (type)more पर संरेखण पा सकते हैं। मूल्य, तथापि, आर्किटेक्चर-निर्भर है, इसलिए पोर्टेबिलिटी के लिए, आपको मैक्रो द्वारा प्रत्येक मशीन पर संरेखण निर्धारित करना चाहिए। जिसका अर्थ है कि एचएससी 2 एच शायद बेहतर तरीका है।

मुझे लगता है कि गलत संरेखण दुर्घटनाओं का कारण बन सकता है, लेकिन मुझे निश्चित रूप से पता नहीं है।

7

संपादित करें: क्षमा करें, मैंने सवाल को गलत तरीके से पढ़ा और सोचा कि आप एचएससी 2 एचएस के साथ ऐसा करने के बारे में पूछ रहे थे, बिना नहीं। गलत संरेखण गलत डेटा का कारण बन सकता है और क्रैश का कारण बन सकता है (मान लें कि क्या आप structs की सरणी को मार्शल कर रहे हैं), तो आपको वास्तव में कुछ पोर्टेबल का उपयोग करना चाहिए।

FFI cookbook के अनुसार, आप को परिभाषित कर सकते

#let alignment t = "%lu", (unsigned long)offsetof(struct {char x__; t (y__); }, y__) 

जो तब

instance Storable Struct where 
    alignment _ = #{alignment my_struct} 
    sizeOf _ = #{size my_struct} 

alignment कीवर्ड के रूप में प्रयोग किया जाता है GHC> 7.2.1 में उपलब्ध होना चाहिए, ताकि आप की जरूरत नहीं होगी इसे अपने आप को बहुत नए ghc के साथ परिभाषित करने के लिए।