#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バリバリで開発されたライブラリをへなちょこ組み込み環境上にポーティングするくらい辛いこともあるよね。