का उपयोग कर स्ट्रक्चर सदस्यों के लिए एग्ग्नास मुझे सी 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 डालने का भी प्रयास किया। मुझे यहां क्या समझ नहीं आ रहा है?
मुझे पता है कि मैं इस विशेष चेतावनी को अनदेखा कर सकता हूं और मुझे समझ में आता है कि पैडिंग क्यों महत्वपूर्ण है, इसलिए मुझे पैडिंग के बारे में कामकाज या स्पष्टीकरण में रूचि नहीं है। मैं जानना चाहता हूं कि मेरे सी को एक पोर्टेबल, मानक अनुरूप तरीके से कैसे बदला जाए ताकि चेतावनी अब उत्सर्जित न हो।
चेतावनी आपको बताती है कि 'शून्य *' सदस्य को सरणी में सही ढंग से गठबंधन करने के लिए संरचना में जोड़े गए चार बाइट्स थे (ताकि संरचना का आकार 'शून्य *' ' एस संरेखण आवश्यकता)। कंपाइलर को बताते हुए कि 'int' सदस्य को' शून्य * 'के रूप में गठबंधन किया जाना चाहिए, उसमें कोई बदलाव नहीं है, अभी भी पैडिंग की चार बाइट आवश्यक हैं। –
@DanielFischer क्या मैं इसे एक डमी बिट-फील्ड के साथ शांत कर सकता हूं? –
यदि आप नहीं कर सके तो मैं बेहद आश्चर्यचकित हूं। यदि आप फ़ील्ड 'int डमी: 26;' जोड़ते हैं, तो या तो प्राकृतिक आकार '8 + 4 + 4' बाइट होगा। (32-बिट 'int के साथ सामान्य 64-बिट प्लेटफॉर्म पर) –