ऐसे कोड के कई फायदे हो सकते हैं, लेकिन दुर्भाग्य से सी स्टैंडर्ड को इसे सुविधाजनक बनाने के लिए नहीं लिखा गया था। कंपाइलरों ने ऐतिहासिक रूप से प्रभावी व्यवहारिक गारंटी की पेशकश की है जो मानक की आवश्यकता से परे है, जिसने मानक सी की तुलना में इस तरह के कोड को बहुत अधिक सफाई से लिखना संभव बना दिया है, लेकिन कंपाइलरों ने अनुकूलन के नाम पर हाल ही में ऐसी गारंटी को रद्द करना शुरू कर दिया है।
सबसे विशेष रूप से, कई सी कंपाइलरों ने ऐतिहासिक रूप से गारंटी दी है (यदि दस्तावेज नहीं है तो डिजाइन द्वारा) कि यदि दो संरचना प्रकारों में एक ही प्रारंभिक अनुक्रम होता है, तो किसी भी प्रकार के एक सूचक का उपयोग उस सामान्य अनुक्रम के सदस्यों तक पहुंचने के लिए किया जा सकता है, भले ही प्रकार असंबंधित हों, और आगे कि एक सामान्य प्रारंभिक अनुक्रम स्थापित करने के प्रयोजनों के लिए संरचना के सभी संकेत समतुल्य हैं। कोड जो इस तरह के व्यवहार का उपयोग करता है, कोड की तुलना में बहुत अधिक क्लीनर और अधिक प्रकार-सुरक्षित हो सकता है जो नहीं करता है, लेकिन दुर्भाग्य से भले ही मानक को एक सामान्य प्रारंभिक अनुक्रम साझा करने वाली संरचनाओं की आवश्यकता होती है, इसे उसी तरह से बाहर रखा जाना चाहिए, यह वास्तव में उपयोग से कोड को निषिद्ध करता है दूसरे के प्रारंभिक अनुक्रम तक पहुंचने के लिए एक प्रकार का एक सूचक।
नतीजतन, यदि आप सी में ऑब्जेक्ट-ओरिएंटेड कोड लिखना चाहते हैं, तो आपको सी के पॉइंटर-टाइप नियमों का पालन करने के लिए बहुत से हुप्स के माध्यम से कूदने के लिए (और इस निर्णय को जल्दी करना चाहिए) या तो करना होगा और तैयार रहना होगा आधुनिक कंपाइलर निरर्थक कोड उत्पन्न करते हैं, यदि कोई पुराना हो जाता है, भले ही पुराने कंपाइलरों ने कोड उत्पन्न किया हो, जो उद्देश्य के रूप में काम करता है, या फिर एक आवश्यकता का दस्तावेज़ बनाता है कि कोड केवल उन कंपाइलरों के साथ उपयोग करने योग्य होगा जो पुराने-शैली सूचक व्यवहार का समर्थन करने के लिए कॉन्फ़िगर किए गए हैं (उदाहरण का उपयोग करके) "-fno- सख्त-अलियासिंग") कुछ लोग "-fno- सख्त-अलियासिंग" को बुराई के रूप में मानते हैं, लेकिन मैं सुझाव दूंगा कि "-fno- सख्त-अलियासिंग" को "भाषा-सख्त" के रूप में समझना उपयोगी है। "मानक" सी की तुलना में कुछ उद्देश्यों के लिए अधिक अर्थ शक्ति प्रदान करता है,लेकिन अनुकूलन की कीमत पर जो कुछ अन्य उद्देश्यों के लिए महत्वपूर्ण हो सकता है।
उदाहरण के अनुसार, पारंपरिक संकलक पर, ऐतिहासिक संकलक निम्नलिखित कोड की व्याख्या करेंगे:
struct pair { int i1,i2; };
struct trio { int i1,i2,i3; };
void hey(struct pair *p, struct trio *t)
{
p->i1++;
t->i1^=1;
p->i1--;
t->i1^=1;
}
क्रम में निम्नलिखित चरणों का पालन करते हुए: पहले सदस्य का वेतन वृद्धि करें, पहले सदस्य के *p
सबसे कम बिट का पूरक करें *t
, फिर पहले सदस्य का वेतन वृद्धि करें और पहले सदस्य के सबसे कम बिट को *p
पूरक करें *t
। आधुनिक कंपाइलर एक फैशन में संचालन के अनुक्रम को फिर से व्यवस्थित करेंगे जो कोड है जो अधिक कुशल होगा यदि p
और t
विभिन्न वस्तुओं की पहचान करें, लेकिन यदि वे नहीं करते हैं तो व्यवहार को बदल देगा।
यह उदाहरण निश्चित रूप से जानबूझ कर दिया गया है, और अभ्यास कोड में जो सदस्यों को एक्सेस करने के लिए एक प्रकार के एक पॉइंटर का उपयोग करता है जो कि दूसरे प्रकार के सामान्य प्रारंभिक अनुक्रम का हिस्सा होता है , आमतौर पर काम करेगा , लेकिन दुर्भाग्य से यह जानने का कोई तरीका नहीं है कि ऐसा कोड कब विफल हो सकता है प्रकार-आधारित एलियासिंग विश्लेषण को छोड़कर इसे सुरक्षित रूप से उपयोग करना संभव नहीं है।
यदि किसी व्यक्ति को दो बिंदुओं की अदला-बदली के लिए स्वैप करने के लिए एक फ़ंक्शन लिखना चाहता था तो कुछ कम वंचित उदाहरण होगा। "1990 के दशक सी" कंपाइलरों के विशाल बहुमत में, जिसे पूरा किया जा सकता है:
void swap_pointers(void **p1, void **p2)
{
void *temp = *p1;
*p1 = *p2;
*p2 = temp;
}
मानक सी में, हालांकि, एक का उपयोग करना होगा:
#include "string.h"
#include "stdlib.h"
void swap_pointers2(void **p1, void **p2)
{
void **temp = malloc(sizeof (void*));
memcpy(temp, p1, sizeof (void*));
memcpy(p1, p2, sizeof (void*));
memcpy(p2, temp, sizeof (void*));
free(temp);
}
यदि *p2
आबंटित संग्रहण में रखा जाता है, और अस्थाई पॉइंटर को आबंटित भंडारण में नहीं रखा जाता है, तो प्रभावी प्रकार *p2
अस्थाई पॉइंटर का प्रकार बन जाएगा, और कोड जो *p2
किसी भी प्रकार के उपयोग के लिए प्रयास करता है जो अस्थायी-पॉइंटर से मेल नहीं खाता है प्रकार अपरिभाषित व्यवहार का आह्वान करेगा। यह सुनिश्चित करना बेहद असंभव है कि एक कंपाइलर इस तरह की सूचना देगा, लेकिन चूंकि आधुनिक कंपाइलर दर्शन की आवश्यकता है कि प्रोग्रामर हर कीमत पर अपरिभाषित व्यवहार से बचें, मैं आवंटित कोड का उपयोग किए बिना उपरोक्त कोड लिखने के किसी अन्य सुरक्षित साधन के बारे में नहीं सोच सकता। ।