らんだむな記憶

blogというものを体験してみようか!的なー

constexpr

#include <cstdio>

constexpr int num(int a = 1)
{
    if ( a == 1 ) {
        return 314;
    }
    else {
        return 271;
    }
}

int main(void)
{
    char buf[ num(1) ];
    printf("%lu\n", sizeof(buf));

    return 0;
}

こんなの書いて、

$ clang++ -O3 -S -o main.s -std=c++14 main.cpp

してみると、

    .section    __TEXT,__text,regular,pure_instructions
    .macosx_version_min 10, 12
    .globl    _main
    .align    4, 0x90
_main:                                  ## @main
    .cfi_startproc
## BB#0:
    pushq    %rbp
Ltmp0:
    .cfi_def_cfa_offset 16
Ltmp1:
    .cfi_offset %rbp, -16
    movq    %rsp, %rbp
Ltmp2:
    .cfi_def_cfa_register %rbp
    leaq    L_.str(%rip), %rdi
    movl    $314, %esi              ## imm = 0x13A
    xorl    %eax, %eax
    callq    _printf
    xorl    %eax, %eax
    popq    %rbp
    retq
    .cfi_endproc

    .section    __TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
    .asciz    "%lu\n"


.subsections_via_symbols

とかなった。最適化しなくても同じだけど、コンパイル時に「314」が解決してるなーと改めて感じる。凄いなぁって思うけど、いざC++03しか使えない環境に持っていかねばなんてことがあったら「-std=c++14」でへいへいしてると即死だなと思ってしまう。
C++11をC++03に戻さなきゃいけなくて辛い話(書きかけ) - Qiitaあぁ、やっぱあるよね。Windows上でbooooooooostバリバリで開発されたライブラリをへなちょこ組み込み環境上にポーティングするくらい辛いこともあるよね。