2017-02-22 7 views
1

には影響しません。私は、簡単なプログラムを書きました。実際に生成されたマシンコードがループ内で結果を評価:constexprののkeyworkは、コード生成

mov  edx, offset aHelloWorld ; "hello world" 
loc_408D00: 
    add  edx, 1 
    mov  eax, edx 
    sub  eax, offset aHelloWorld ; "hello world" 
    cmp  byte ptr [edx], 0 
    jnz  short loc_408D00 
    leave 
    retn 

プログラムは、フラグ-std=c++11 -Ofast -O2とG ++バージョン5.3でコンパイルされています。 Visual Studio 2013とg ++ 4.9で得たのと同じ結果です。

Quaestionコンパイラが指定されたコードを最適化できなかった理由は何ですか?

+0

g ++とclang ++の両方がコードを最適化します。これはコンパイラの実装に依存します。 –

+0

@VittorioRomeo g ++のバージョンと必要なコンパイルフラグを言うことができますか? –

+1

GCC 6、ICC 16、およびClang 3.1はすべて、単純に値11をロードして戻ります。これらは対話型の解体サイト[gcc.godbolt.org](http://gcc.godbolt.org/)にあります。また、Microsoft C++ 19.10(私はどのVisual Studioも知らない)は、Dineshの答えでさえも最適化できません。 – Potatoswatter

答えて

3

constexpr関数は、必ずしもコンパイル時に評価されるとは限りません。 constexprのコンテキストで使用される場合は、それはコンパイル時に評価されなければならない、だから、次は関係なく、コンパイラの最適化の動作します:

main: 
     mov  eax, 11 
     ret 

int main() 
{ 
    constexpr auto len = strlen_c("hello world"); 
    return len; 
} 

後は、上記のコードのために生成されたアセンブリであります

Demo

+0

Microsoftのコンパイラは、実行時に[strlen_c](まだ実行中)(https://godbolt.org/g/bOkR4w)です。次に、結果を破棄して定数11を返します。標準では性能保証はありません... – Potatoswatter