2011-03-25 15 views
21

मुझे आश्चर्य है कि सी ++ में कक्षाओं और सी स्टाइल structs की प्रदर्शन तुलना g ++ -O3 विकल्प के साथ होती है। क्या इसके बारे में कोई बेंचमार्क या तुलना है। मैंने हमेशा सी ++ कक्षाओं को भारी और संभावित रूप से धीमे के रूप में सोचा है (संकलन समय मेरे लिए बहुत महत्वपूर्ण नहीं है, रन टाइम अधिक महत्वपूर्ण है)। मैं एक बी-पेड़ को लागू करने जा रहा हूं, क्या मुझे इसे प्रदर्शन के लिए कक्षाओं या structs के साथ लागू करना चाहिए।स्ट्रक्चर बनाम कक्षाओं के प्रदर्शन

+4

आप अपने कौन से सटीक जुड़वां सबसे ज्यादा प्यार करते हैं? –

+2

असल में मैंने सी ++ structs की उन्नत विशेषताओं का कभी भी उपयोग नहीं किया है, मैंने हमेशा सी डेटा की तरह सार्वजनिक डेटा के लिए डेटा कंटेनर के रूप में उपयोग किया है। जब मुझे विरासत, बहुरूपता आदि जैसी जटिल कार्यक्षमताओं की आवश्यकता होती है, तो मैं कक्षाओं का उपयोग करना पसंद करता हूं। तो यह एक प्यार और नफरत संबंध नहीं है – systemsfault

उत्तर

46

रनटाइम स्तर पर सी 0+ में सभी पर structs और कक्षाओं के बीच कोई अंतर नहीं है। इसलिए यदि आप अपने कोड में struct A या class A का उपयोग करते हैं तो यह कोई प्रदर्शन अंतर नहीं करता है।

अन्य बात, कुछ विशेषताओं जैसे कि कन्स्ट्रक्टर, विनाशक और आभासी कार्यों का उपयोग कर रही है, - कुछ प्रदर्शन दंड हो सकते हैं (लेकिन यदि आप उनका उपयोग करते हैं तो आपको शायद उन्हें वैसे भी चाहिए)। लेकिन आप समान सफलता के साथ अपनी कक्षा या संरचना दोनों के अंदर उपयोग कर सकते हैं।

this document में आप सी ++ के अन्य प्रदर्शन-संबंधित subtleties के बारे में पढ़ सकते हैं।

+0

क्या आप उनकी स्मृति खपत के बारे में कोई दस्तावेज़ या बेंचमार्क जानते हैं: structs बनाम कक्षाएं। – systemsfault

+8

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

2

AFAIK, प्रदर्शन बिंदु से, वे सी ++ के बराबर हैं।

उनका अंतर synctatic चीनी है जैसे स्ट्रक्चर सदस्यों डिफ़ॉल्ट रूप से सार्वजनिक हैं, उदाहरण के लिए।

my2c

17

सी ++ में, struct कक्षाएं जिसके सदस्य डिफ़ॉल्ट रूप से सार्वजनिक कर रहे हैं के लिए वाक्यात्मक चीनी है।

+9

या इसे एक और तरीके से देखते हुए, 'स्ट्रक्चर' सिंटैक्स है जो सी के पीछे पिछड़ा है, और 'कक्षा' कक्षाओं के लिए अधिक ओओपी जैसी सिंटैक्टिक चीनी है जिसका सदस्य डिफ़ॉल्ट रूप से निजी हैं ... –

+6

मैं यह जवाब देना चाहता हूं +1.000.000 (केवल थोड़ा उत्सुक;)) अगर मैं कर सकता हूं, क्योंकि गलत सवाल जो मूल प्रश्न की ओर जाता है वह इतना व्यापक है। इसलिए हर कोई मेरे पीछे दोहराता है: "**' struct' और 'class' समकक्ष ** (डिफ़ॉल्ट पहुंच को छोड़कर) " –

+1

मैं चीनी से दूर हूं। क्या मुझे चीनी मुक्त संरचना मिल सकती है? –

3

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

+1

उन्होंने कक्षाओं और structs के बीच मतभेदों के बारे में स्पष्ट रूप से पूछा और सॉफ्टवेयर डिजाइन के बारे में युक्तियों के बारे में नहीं। – Tara

7

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

0

बस एक प्रयोग करें, लोग! ,

#include <iostream> 
#include <string> 
#include <ctime> 
using namespace std; 
class foo { 
    public: 
    void foobar(int k) { 
     for (k; k > 0; k--) { 
     cout << k << endl; 
     } 
    } 
    void initialize() { 
     accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf"; 
    } 
    string accessor; 
}; 
struct bar { 
    public: 
    void foobar(int k) { 
     for (k; k > 0; k--) { 
     cout << k << endl; 
     } 
    } 
    void initialize() { 
     accessor = "asdfasdfasdfasdfasdfasdfasdfasdfasdfasdf"; 
    } 
    string accessor; 
}; 

int main() { 
    clock_t timer1 = clock(); 
    for (int j = 0; j < 200; j++) { 
    foo f; 
    f.initialize(); 
    f.foobar(7); 
    cout << f.accessor << endl; 
    } 
    clock_t classstuff = clock(); 
    clock_t timer2 = clock(); 
    for (int j = 0; j < 200; j++) { 
    bar b; 
    b.initialize(); 
    b.foobar(7); 
    cout << b.accessor << endl; 
    } 
    clock_t structstuff = clock(); 
    cout << "struct took " << structstuff-timer2 << endl; 
    cout << "class took " << classstuff-timer1 << endl; 
    return 0; 
} 

अपने कंप्यूटर पर struct 1286 घड़ी टिक्स ले लिया, और वर्ग 1450 घड़ी टिक्स ले लिया:

यहाँ प्रयोग मैं तैयार किया गया है के लिए कोड है। अपने प्रश्न का उत्तर देने के लिए, संरचना थोड़ा तेज है। हालांकि, इससे कोई फर्क नहीं पड़ता, क्योंकि कंप्यूटर इन दिनों इतनी तेजी से हैं।

+0

दरअसल, यह परीक्षण इष्टतम नहीं हो सकता है, प्रोसेसर को इसे निष्पादित करने के लिए तैयार होने के बाद पहले परीक्षण में दूसरे से अधिक समय लग जाएगा। उपायों को लेने से पहले कई बार लूप चलाने और आईओ का उपयोग करने से बचने के लिए बेहतर होगा क्योंकि यह माप परिशुद्धता में काफी बाधा डालता है। मैंने आपके परीक्षण में कुछ बदलाव किए हैं और मेरे नतीजे बताते हैं कि दोनों का प्रदर्शन समान होता है, कभी-कभी कोई दूसरा बार दूसरी बार थोड़ा तेज़ हो जाता है, यानी: (कक्षा: 1116, 530, 523, 507) (संरचना: 1087, 4 9 8, 541 , 543)। – VinGarcia

+0

मेरा मूल कोड ऐसा करना था, लेकिन मैंने इसे दुर्घटना से हटा दिया, इसलिए मैंने पोस्ट करने के लिए कुछ त्वरित और गंदे कोड लिखा :) – ndrewxie

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