2013-04-09 9 views
5

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

ps मुझे पता है कि प्रदर्शन अंतर कोई फर्क नहीं पड़ता है, लेकिन मैं इसे "दाएं" सी ++ 11 तरीके से करना चाहता हूं।

void MainWindow::UpdateDateTimes() 
{ 
// for some dumb reason DateTime only has add seconds method 
    // so we have to calculate the seconds per hour and the number of hours 
    // we do this with static constant values so that the calculations 
    // only happen once. 
    static constexpr const int secsPerHour = 60 * 60; 
    static constexpr const int cdtOffsetHours = -5; 
    static constexpr const int edtOffsetHours = -4; 
    static constexpr const int cetOffsetHours = 2; 
    static constexpr const int cdtOffsetSecs = secsPerHour * cdtOffsetHours; 
    static constexpr const int edtOffsetSecs = secsPerHour * edtOffsetHours; 
    static constexpr const int cetOffsetSecs = secsPerHour * cetOffsetHours; 

    QDateTime time(QDateTime::currentDateTimeUtc()); 

    ui->mTimeLocal->setDateTime(time.toLocalTime()); 

    ui->mTimeCDT->setDateTime(time.addSecs(cdtOffsetSecs)); 
    ui->mTimeEDT->setDateTime(time.addSecs(edtOffsetSecs)); 
    ui->mTimeCET->setDateTime(time.addSecs(cetOffsetSecs)); 
} 
+0

'constexpr' का अर्थ है 'const'। – Xeo

+1

'const int 'प्रत्येक के लिए पर्याप्त है, लेकिन' constexpr int' अधिक स्पष्ट हो सकता है। कृपया दो मिश्रण न करें। – ipc

+0

प्रत्येक बार फ़ंक्शन कहलाता है, और इसलिए गणना भी बनाई जानी चाहिए? मुझे पता है कि इसे अनुकूलित किया जा सकता है, लेकिन मैं इसे सही करना चाहता हूं ताकि कोड कहता है कि मैं वास्तव में क्या कह रहा हूं। – EddieV223

उत्तर

7

आपका उपयोग ठीक है, अगर थोड़ा वर्बोज़ नहीं है। इस संदर्भ में constexpr और const का अर्थ बिल्कुल वही बात है। या तो एक (या यहां तक ​​कि दोनों) करेंगे।

Fwiw, std::chrono::hours::period::num60*60 निर्दिष्ट करने का एक और तरीका होगा (यदि आप कुछ C++ 11 क्रेडिट :-) को दिखाना चाहते हैं)।

या वास्तव में तुम सिर्फ कर सकता है:

void MainWindow::UpdateDateTimes() 
{ 
    constexpr std::chrono::seconds cdtOffsetSecs = std::chrono::hours(-5); 
    constexpr std::chrono::seconds edtOffsetSecs = std::chrono::hours(-4); 
    constexpr std::chrono::seconds cetOffsetSecs = std::chrono::hours(2); 

    QDateTime time(QDateTime::currentDateTimeUtc()); 

    ui->mTimeLocal->setDateTime(time.toLocalTime()); 

    ui->mTimeCDT->setDateTime(time.addSecs(cdtOffsetSecs.count())); 
    ui->mTimeEDT->setDateTime(time.addSecs(edtOffsetSecs.count())); 
    ui->mTimeCET->setDateTime(time.addSecs(cetOffsetSecs.count())); 
} 

इसके अलावा, मैं static ड्रॉप करने के लिए परीक्षा होगी। मेरे सिस्टम पर सटीक एक ही कोड static के साथ या उसके बिना उत्पन्न होता है। यह सब संकलन समय पर हो रहा है, इसलिए static "केवल एक बार" प्रारंभिक अर्थशास्त्र के लिए कोई आवश्यकता नहीं है।

अद्यतन

बस इस क्रिस्टल स्पष्ट कर देना, मैं करने के लिए मूल उदाहरण संपादित:

void f(int); 

void UpdateDateTimes() 
{ 
    constexpr std::chrono::seconds cdtOffsetSecs = std::chrono::hours(-5); 
    constexpr std::chrono::seconds edtOffsetSecs = std::chrono::hours(-4); 
    constexpr std::chrono::seconds cetOffsetSecs = std::chrono::hours(2); 

    f(cdtOffsetSecs.count()); 
} 

-O1 बजना साथ ++ और libC++ (अनुकूलन मुश्किल से सक्षम) के साथ संकलित और विधानसभा है :

.globl __Z15UpdateDateTimesv 
    .align 4, 0x90 
__Z15UpdateDateTimesv:     ## @_Z15UpdateDateTimesv 
    .cfi_startproc 
## BB#0: 
    pushq %rbp 
Ltmp2: 
    .cfi_def_cfa_offset 16 
Ltmp3: 
    .cfi_offset %rbp, -16 
    movq %rsp, %rbp 
Ltmp4: 
    .cfi_def_cfa_register %rbp 
    movl $-18000, %edi   ## imm = 0xFFFFFFFFFFFFB9B0 
    popq %rbp 
    jmp __Z1fi     ## TAILCALL 
    .cfi_endproc 

मैं तो एक ही सेटिंग्स के साथ इस कार्यक्रम संकलित:

01,235,
void UpdateDateTimes2() 
{ 
    f(-18000); 
} 

और उत्पन्न विधानसभा है:

.globl __Z16UpdateDateTimes2v 
    .align 4, 0x90 
__Z16UpdateDateTimes2v:     ## @_Z16UpdateDateTimes2v 
    .cfi_startproc 
## BB#0: 
    pushq %rbp 
Ltmp7: 
    .cfi_def_cfa_offset 16 
Ltmp8: 
    .cfi_offset %rbp, -16 
    movq %rsp, %rbp 
Ltmp9: 
    .cfi_def_cfa_register %rbp 
    movl $-18000, %edi   ## imm = 0xFFFFFFFFFFFFB9B0 
    popq %rbp 
    jmp __Z1fi     ## TAILCALL 
    .cfi_endproc 

तो imho इस रूप में भी कभी एक free lunch जाता के बारे में के रूप में करीब है। :-)

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