2009-05-18 16 views
17

कैसे मैं अपने आप आवंटनगतिशील रूप से आवंटन और तैरता

के दौरान शून्य (0.0) को तैरता की एक गतिशील आवंटित सरणी सेट करूँ की एक सरणी शून्य की स्थापना यह ठीक

float* delay_line = new float[filter_len]; 

//THIS 
memset(delay_line, 0.0, filter_len); //can I do this for a float?? 

//OR THIS 
for (int i = 0; i < filter_len; i++) 
    delay_line[i] = 0.0; 

कौन सबसे कारगर है जिस तरह से

धन्यवाद

उत्तर

15

उपयोग

#include <algorithm> 
... 
std::fill_n(delay_line, filer_len, 0) 
+0

यदि आप वेक्टर का उपयोग नहीं कर सकते हैं, तो यह करने के लिए यह सबसे अधिक प्रकार का सुरक्षित, आधुनिक सी ++ तरीका है। मेमसेट तेजी से हो सकता है, लेकिन यह सिर्फ टाइप प्रकार की जांच के साथ शून्य बाइट्स है, अगर आपको अपना गणित गलत लगता है तो आप परेशानी में हैं। – iain

+0

मैं fill_n को पसंदीदा विधि होने पर सहमत हूं, भले ही यह थोड़ा धीमा हो (और मुझे विश्वास होगा कि जब मैं इसे देखता हूं;) स्मृति के विपरीत, यह विधि दोनों प्रकार सुरक्षित और अधिक आसान 'एक्स्टेंसिबल/अनुकूलनीय' है (आप उदाहरण के लिए 4.2 को भी शुरू करने के लिए इस विधि का उपयोग कर सकते हैं) – Pieter

32

sizeof(float) * filter_len का उपयोग करें जब तक कि आप कुछ अजीब कार्यान्वयन में काम नहीं कर रहे हैं जहां sizeof(float) == sizeof(char)

memset(delay_line, 0, sizeof(float) * filter_len); 

संपादित करें: Stephan202 अंक टिप्पणी में बाहर के रूप में, 0.0 memset के लिए कोड करने के बाद से 0.0 के लिए आईईईई मानक प्रतिनिधित्व सब शून्य बिट्स है एक विशेष रूप से आसान चल बिन्दु मान है।

मेमेट स्मृति की दायरे में काम कर रहा है, संख्याओं के दायरे में नहीं। दूसरा पैरामीटर, एक इंट घोषित किया गया है, एक हस्ताक्षरित चार को डाला जाता है। यदि सी ++ का आपका कार्यान्वयन प्रति बाइट चार बाइट्स का उपयोग करता है, तो निम्नलिखित रिश्ते हैं:

  • यदि आप 0 के साथ फ्लोट को याद करते हैं, तो मान 0.0 होगा।
  • यदि आप फ्लोट को 1 के साथ याद करते हैं, तो मूल्य 2.36943e-38 होगा।
  • यदि आप 42 के साथ फ्लोट को याद करते हैं, तो मूल्य 1.51137e-13 होगा।
  • यदि आप 64 के साथ फ्लोट को याद करते हैं, तो मूल्य 3.00392 होगा।

तो शून्य एक विशेष मामला है।

इस अजीब लगता है, याद करते हैं कि memset <cstring> या <string.h> में घोषित किया जाता है, और अक्सर जैसी चीजों को बनाने के लिए प्रयोग किया जाता है "***************" या "------------------"। यह भी शून्य स्मृति में उपयोग किया जा सकता है एक निफ्टी दुष्प्रभाव है।

मिलान बाबुस्कोव टिप्पणियों में बताते हैं, मैक और लिनक्स पर पल के लिए उपलब्ध एक फ़ंक्शन बजरो (गैर मानक और बहिष्कृत) है, लेकिन माइक्रोसॉफ्ट नहीं है, क्योंकि यह विशेष रूप से शून्य को सुरक्षित रूप से सेट करने के लिए तैयार है, सुरक्षित रूप से कुछ निर्देश छोड़ देता है। यदि आप इसका उपयोग करते हैं, और आपके कंपाइलर की एक प्यूरिटनिकल भविष्य की रिलीज इसे छोड़ देती है, तो स्थानीय अनुकूलता पैच में खुद को बजरो लागू करने के लिए तुच्छ है, जब तक कि भविष्य की रिलीज में ने किसी अन्य उद्देश्य के लिए नाम का पुन: उपयोग नहीं किया।

+0

धन्यवाद, क्या यह प्रत्येक मान को देरी_लाइन से 0.0 में सेट करेगा? –

+0

+1, सही विकल्प। मेमसेट() सबसे तेज़ तरीका है। –

+6

हां, यह प्रत्येक मान को 0.0 पर सेट करेगा: यदि साइन, एक्सपोनेंट और अंश 0 हैं, तो फ्लोट 0.0 का प्रतिनिधित्व करता है: http://en.wikipedia.org/wiki/IEEE_754-1985 – Stephan202

3

अब हम इस पर हैं: vector कक्षा का उपयोग करना बेहतर होगा।

std::vector<float> delay_line(filter_len); 

वेक्टर शून्य initialised किया जाएगा:

std::vector<float> delay_line(filter_len, 0.0); 
+0

लेकिन नील के उत्तर पर नज़र डालें: आपको 0.0 तर्क की आवश्यकता नहीं होगी: यह डिफ़ॉल्ट प्रारंभिक तर्क मान है। – xtofl

11

एक std :: वेक्टर बजाय का उपयोग करें।

+0

सबसे कुशल तरीका नहीं है, लेकिन निश्चित रूप से सबसे सुंदर है। –

+3

प्रोग्रामर प्रयास (विनाश को प्रबंधित करने की कोई आवश्यकता नहीं) के मामले में यह सबसे कुशल है और यह आमतौर पर अनुकूलित करने के लिए सबसे महत्वपूर्ण बात है। –

+1

स्टैक पर किसी सरणी के लिए विनाश या निर्माण का प्रबंधन करने की कोई आवश्यकता नहीं है :-) –

2

कौन सबसे कारगर तरीका

memset है शायद एक बालक तेजी से है, लेकिन जो परवाह करता है!?!? इस स्तर तक सूक्ष्म अनुकूलन समय की कुल बर्बादी है, जब तक कि आप एक कैलकुलेटर प्रोग्रामिंग नहीं कर रहे हों, और शायद तब भी नहीं।

मुझे लगता है कि जिस तरह से memset स्पष्ट है, लेकिन मुझे लगता है कि तुम सच में था बेहतर memset के लिए अपने आदमी पृष्ठों की जाँच ... मैं मानक पुस्तकालयों के अपने संस्करण एक memset समारोह जो एक नाव लेता है, तो आश्चर्य होगा दूसरे तर्क के रूप में।

पीएस: शून्य का प्रतिनिधित्व करने वाला बिट पैटर्न दोनों पूर्णांक और फ्लोट्स के लिए समान है ... यह डिज़ाइन द्वारा है, न सिर्फ शुभकामनाएं।

अच्छी किस्मत ;-)

चीयर्स। कीथ।

float* delay_line = new float[filter_len](); 
+3

बैशिंग माइक्रो-ऑप्टिमाइज़ेशन समय की कुल बर्बादी है। अगर क्यूएस को अनुकूलन की आवश्यकता नहीं है, तो वह क्यों पूछेगा कि सबसे प्रभावी तरीका कौन सा है? –

+1

मैं मेमसेट पसंद करता हूं लेकिन यह सुनिश्चित नहीं था कि फ्लोटिंग पॉइंट शून्य का बाइनरी प्रस्तुति पूर्णांक शून्य –

12

एक गतिशील आवंटित सरणी के तत्वों कोष्ठकों के एक खाली जोड़ी द्वारा सरणी आकार का पालन करते हुए तत्व प्रकार का डिफ़ॉल्ट मान के लिए शुरू किया जा सकता है शून्य एक ही समय में:

float *delay_line = (float *)calloc(sizeof(float), filter_len); 

लाभ है कि यहाँ, अपने malloc क्रियान्वयन के आधार पर, यह संभव सरणी के शून्यीकरण से बचने के लिए अगर यह याद है कि पहले से ही ध्यान केंद्रित किया है से आवंटित किया जाना जाना जाता है हो सकता है (के रूप में पृष्ठों से आवंटित है ऑपरेटिंग sys tem अक्सर हैं)

ध्यान रखें कि आपको इस तरह के सरणी पर [] को हटाने के बजाय मुफ्त() का उपयोग करना होगा।

+1

आधुनिक-सी ++ बुद्धिमान को साफ़ करने के लिए धन्यवाद: क्या इसे सर्वोत्तम उत्तर में प्रचारित नहीं किया जाना चाहिए? –

3

एक अन्य विकल्प के आवंटन के लिए calloc उपयोग करने के लिए है और:

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