2017-02-09 3 views
-4

参照は通常のポインタとしてコンパイルされていますか、それとも後ろに別のものがありますか?gccのリファレンスはどのようにasmに変換されますか?

そして、clangの違いはどうですか?

+4

簡単なテストプログラムを作成し、異なるコンパイラでビルドし、生成されたコードを調べてみましょう。 –

+0

複雑な状況が異なる可能性があります。 – ska

+2

コンパイラが参照された項目のエイリアスとして扱うことができるため、生成されたコードに存在する必要がないことがあります。 –

答えて

1

リファレンスは、使用時に自動的に参照解除される不変のポインタと考えることができます。これはC++の標準ではないので、実際の実装に頼ることはできません。

実際には、多くの場合、あなたが見るものになる可能性が高いです。
は、パラメータパッシングの場合に、次の例を取る:

#include <stdio.h> 

void function (int *const n){ 
    printf("%d",*n); 
} 

void function (int & n){ 
    printf("%d",n); 
} 

int main(){ 
    int n = 123; 
    function(&n); 
    function(n); 
} 

両方gccclang有効任意の最適化なしで機能するため、同一のコードを生成する:

function(int*): 
     push rbp 
     mov  rbp, rsp 
     sub  rsp, 16 
     mov  QWORD PTR [rbp-8], rdi 
     mov  rax, QWORD PTR [rbp-8] 
     mov  eax, DWORD PTR [rax] 
     mov  esi, eax 
     mov  edi, OFFSET FLAT:.LC0 
     mov  eax, 0 
     call printf 
     nop 
     leave 
     ret 
function(int&): 
     push rbp 
     mov  rbp, rsp 
     sub  rsp, 16 
     mov  QWORD PTR [rbp-8], rdi 
     mov  rax, QWORD PTR [rbp-8] 
     mov  eax, DWORD PTR [rax] 
     mov  esi, eax 
     mov  edi, OFFSET FLAT:.LC0 
     mov  eax, 0 
     call printf 
     nop 
     leave 
     ret 
0

参照は、ASMに変換どのようにgccで?

一般的には、それに依存します。

特定のケースでは、生成されたアセンブリを読み取ってテストすることができます。

参照は通常のポインタとしてコンパイルされていますか、それとも他のものがありますか?

参照を使用するコードの実装は、同じインダイレクションを実現するためにポインタを使用するコードと実質的に同じです。どのように実装されているかは、標準によって保証されているわけではありませんが、それらを別々に実装する必要はありません。

参考文献は、C++の規則で使用できるようにポインタと異なるだけです。もちろん、ルールが異なるため、ポインタは参照できない方法で使用することができます。そのような場合、ポインタが同じアセンブリを生成するかどうかを比較することはできません。参照

制限が簡単にいくつかの最適化を行う可能性があるので、そこの違いかもしれませんが、そのような最適化はまた、ポインタと可能されているだろう、だからではなく、参照を使用したときに別のアセンブリ出力の保証はありませんポインタの。

そして、clangの違いは?

一般的には、それに依存します。

どちらのコンパイラも、標準と同じ規則でバインドされています。彼らは同じアセンブリを生成するかもしれないし、異なってもよい。 1つのコンパイラの特定のバージョンの生成されたアセンブリが、特定のバージョンの別のコンパイラによって生成されたアセンブリから、(特定のオペレーティングシステムの特定のプロセッサアーキテクチャ上の、特定のコンパイルオプションを使用して)特定のケースごとに生成されたアセンブリを検査して比較することによって、参照を見つけることができます。

関連する問題