1

C 言語の名前付き戻り値の最適化を制御するフラグが見つかりませんでした。C++ の場合は -fno-elide-constructors のようです。

これを実装したソースコードはこちらですが、ミドルエンドなのでコメントでもフロントエンドの情報はネタバレしていません。 マニュアルセクションも正確には役に立ちませんでした。ただし、逆アセンブルすると、O0 でオフになり、O1 で有効になるため、次のいずれかである必要があります。

      -fauto-inc-dec 
      -fcprop-registers 
      -fdce 
      -fdefer-pop 
      -fdelayed-branch 
      -fdse 
      -fguess-branch-probability 
      -fif-conversion2 
      -fif-conversion 
      -finline-small-functions 
      -fipa-pure-const 
      -fipa-reference 
      -fmerge-constants
      -fsplit-wide-types 
      -ftree-builtin-call-dce 
      -ftree-ccp 
      -ftree-ch 
      -ftree-copyrename 
      -ftree-dce 
      -ftree-dominator-opts 
      -ftree-dse 
      -ftree-fre 
      -ftree-sra 
      -ftree-ter 
      -funit-at-a-time

C コード:

struct p {
    long x;
    long y;
    long z;
};

__attribute__((noinline))
struct p f(void) {
    struct p copy;
    copy.x = 1; 
    copy.y = 2;
    copy.z = 3;
    return copy;
}

int main(int argc, char** argv) {
    volatile struct p inst = f();
    return 0;
}

O0 でコンパイルすると、「コピー」構造が単純にスタックに割り当てられていることがわかります。

00000000004004b6 <f>:
  4004b6:   55                      push   rbp
  4004b7:   48 89 e5                mov    rbp,rsp
  4004ba:   48 89 7d d8             mov    QWORD PTR [rbp-0x28],rdi
  4004be:   48 c7 45 e0 01 00 00    mov    QWORD PTR [rbp-0x20],0x1
  4004c5:   00 
  4004c6:   48 c7 45 e8 02 00 00    mov    QWORD PTR [rbp-0x18],0x2
  4004cd:   00 
  4004ce:   48 c7 45 f0 03 00 00    mov    QWORD PTR [rbp-0x10],0x3
  4004d5:   00 
  4004d6:   48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  4004da:   48 8b 55 e0             mov    rdx,QWORD PTR [rbp-0x20]
  4004de:   48 89 10                mov    QWORD PTR [rax],rdx
  4004e1:   48 8b 55 e8             mov    rdx,QWORD PTR [rbp-0x18]
  4004e5:   48 89 50 08             mov    QWORD PTR [rax+0x8],rdx
  4004e9:   48 8b 55 f0             mov    rdx,QWORD PTR [rbp-0x10]
  4004ed:   48 89 50 10             mov    QWORD PTR [rax+0x10],rdx
  4004f1:   48 8b 45 d8             mov    rax,QWORD PTR [rbp-0x28]
  4004f5:   5d                      pop    rbp
  4004f6:   c3                      ret    

O1 でコンパイルすると、割り当てられませんが、ポインターが暗黙の引数として渡されます

00000000004004b6 <f>:
  4004b6:   48 89 f8                mov    rax,rdi
  4004b9:   48 c7 07 01 00 00 00    mov    QWORD PTR [rdi],0x1
  4004c0:   48 c7 47 08 02 00 00    mov    QWORD PTR [rdi+0x8],0x2
  4004c7:   00 
  4004c8:   48 c7 47 10 03 00 00    mov    QWORD PTR [rdi+0x10],0x3
  4004cf:   00 
  4004d0:   c3                      ret 
4

1 に答える 1

2

GCC のそれに最も近いもの (つまり、コピー省略のスイッチ) は-fcprop-registers. コピー省略は C には存在しませんが、これはそれに最も類似した機能です。マニュアルページから:

レジスタ割り当てとレジスタ割り当て後の命令分割の後、コピー伝播パスを実行して、スケジューリングの依存関係を減らし、場合によってはコピーを排除しようとします。レベル -O、-O2、-O3、-Os で有効です。

于 2016-01-23T09:58:50.810 に答える