2013-02-22 50 views
5

का उपयोग कर स्ट्रक्चर सदस्यों के लिए एग्ग्नास मुझे सी 11 और structs का उपयोग करके कुछ परेशानी हो रही है।_ क्लैंग और सी 11

मैंने पहले से ही Structure member alignment with _Alignas पढ़ा है, और मैंने क्लैंग दस्तावेज़ों में देखा और देखा कि यह अब समर्थित है।

इसके अलावा, मैं हाल ही में ट्रंक से निर्मित क्लैंग का एक बहुत नया संस्करण उपयोग कर रहा हूं।

$ clang --version 
clang version 3.3 (trunk 175473) 
Target: x86_64-unknown-linux-gnu 
Thread model: posix 

समस्या मैं में चल रहा हूँ यह है:

#include <stdlib.h> 
#include <stdalign.h> 

struct foo{ 
    void* a; 
    int b; 
}; 

int main() { 
    struct foo instance; 

    instance.a = NULL; 
    instance.b = 2; 

    return 0; 
} 

कौन मुझे यह चेतावनी फेंकता है:

$ clang -Weverything -std=c11 t.c 
t.c:4:8: warning: padding size of 'struct foo' with 4 bytes to alignment boundary [-Wpadded] 
struct foo{ 
    ^
1 warning generated. 

अब यह है कि क्या _Alignas के लिए है नहीं है? मैंने int सदस्य घोषणा से पहले इसे डालने का प्रयास किया, जैसे:

struct foo{ 
    void* a; 
    _Alignas(void*) int b; 
}; 

लेकिन वही चेतावनी बनी हुई है। मैंने बिना किसी लाभ के _ विभिन्न स्थानों पर _Aignignas डालने का भी प्रयास किया। मुझे यहां क्या समझ नहीं आ रहा है?

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

+1

चेतावनी आपको बताती है कि 'शून्य *' सदस्य को सरणी में सही ढंग से गठबंधन करने के लिए संरचना में जोड़े गए चार बाइट्स थे (ताकि संरचना का आकार 'शून्य *' ' एस संरेखण आवश्यकता)। कंपाइलर को बताते हुए कि 'int' सदस्य को' शून्य * 'के रूप में गठबंधन किया जाना चाहिए, उसमें कोई बदलाव नहीं है, अभी भी पैडिंग की चार बाइट आवश्यक हैं। –

+0

@DanielFischer क्या मैं इसे एक डमी बिट-फील्ड के साथ शांत कर सकता हूं? –

+0

यदि आप नहीं कर सके तो मैं बेहद आश्चर्यचकित हूं। यदि आप फ़ील्ड 'int डमी: 26;' जोड़ते हैं, तो या तो प्राकृतिक आकार '8 + 4 + 4' बाइट होगा। (32-बिट 'int के साथ सामान्य 64-बिट प्लेटफॉर्म पर) –

उत्तर

2

-Weverything सी द्वारा आवश्यक सभी डायग्नोस्टिक संदेशों के साथ-साथ सी द्वारा आवश्यक कुछ डायग्नोस्टिक्स प्रिंट करता है। यहां मुद्रित डायग्नोस्टिक को सी द्वारा आवश्यक नहीं है: इसका उद्देश्य जानकारीपूर्ण है और आपका प्रोग्राम पहले से ही सख्ती से अनुरूप है। सी का कहना है कि एक कार्यान्वयन अतिरिक्त डायग्नोस्टिक संदेशों का उत्पादन करने के लिए स्वतंत्र है जब तक कि यह प्रोग्राम का अनुवाद करने में विफल नहीं होता है।

+1

तो इस विशेष नैदानिक ​​के लिए प्रेरणा क्या है? कि मैं किसी भी तरह से संरचना को संभावित रूप से बदल सकता हूं ताकि अगर मेरे पास एरे थे तो प्रदर्शन की समस्या नहीं होगी क्योंकि संरचना को स्मृति में गलत तरीके से गलत किया गया था? –

+1

आपको सूचित करने के लिए कि संरचना ऑब्जेक्ट की तुलना में अधिक बाइट्स ले सकते हैं? – ouah

+1

ठीक है इसे मिला। धन्यवाद। –