答えて
リファレンスは、使用時に自動的に参照解除される不変のポインタと考えることができます。これは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);
}
両方gcc
とclang
有効任意の最適化なしで機能するため、同一のコードを生成する:
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
参照は、ASMに変換どのようにgccで?
一般的には、それに依存します。
特定のケースでは、生成されたアセンブリを読み取ってテストすることができます。
参照は通常のポインタとしてコンパイルされていますか、それとも他のものがありますか?
参照を使用するコードの実装は、同じインダイレクションを実現するためにポインタを使用するコードと実質的に同じです。どのように実装されているかは、標準によって保証されているわけではありませんが、それらを別々に実装する必要はありません。
参考文献は、C++の規則で使用できるようにポインタと異なるだけです。もちろん、ルールが異なるため、ポインタは参照できない方法で使用することができます。そのような場合、ポインタが同じアセンブリを生成するかどうかを比較することはできません。参照の
制限が簡単にいくつかの最適化を行う可能性があるので、そこの違いかもしれませんが、そのような最適化はまた、ポインタと可能されているだろう、だからではなく、参照を使用したときに別のアセンブリ出力の保証はありませんポインタの。
そして、clangの違いは?
一般的には、それに依存します。
どちらのコンパイラも、標準と同じ規則でバインドされています。彼らは同じアセンブリを生成するかもしれないし、異なってもよい。 1つのコンパイラの特定のバージョンの生成されたアセンブリが、特定のバージョンの別のコンパイラによって生成されたアセンブリから、(特定のオペレーティングシステムの特定のプロセッサアーキテクチャ上の、特定のコンパイルオプションを使用して)特定のケースごとに生成されたアセンブリを検査して比較することによって、参照を見つけることができます。
- 1. ASMインタープリタ:ローカル変数はどのように格納されていますか?
- 2. ASM ...どのようにこの小さなASMコードはC++
- 3. gcc/g ++はどのようにブートストラップされていますか?
- 4. GCCで生成されたasmをコンパイルするにはどうすればよいですか?
- 5. C++リファレンスはマクロ置換のように機能しますか?
- 6. GCCでクラスメンバ関数のアドレスをasmで取得するにはどうすればよいですか?
- 7. このスニペットはどのようにハスケルに変換されますか?
- 8. リアクションスニペットはブラウザのJavascriptにどのように変換されますか?
- 9. デフォルトコンストラクタの引数はどのようにフィールドに変換されますか?
- 10. マウスの位置はスクロールコントロールにどのように変換されますか?
- 11. WebViewPageクラスはASP.Net MVCのhtmlにどのように変換されますか?
- 12. Pythonモジュールパスはどのようにファイルシステムパスに変換されますか?
- 13. curlコマンドはどのようにJavaコードに変換されますか?
- 14. Microsoft DOS SETコマンドはどのようにC#に変換されますか?
- 15. オブジェクトはどのように配列に変換されますか?
- 16. std :: ostringstreamはどのようにしてboolに変換されますか?
- 17. weak-strongリファレンスはobjective-cのようにどのように見えますか?
- 18. gnu gcc標準ライブラリstdC++、gcc、およびgcc_ehはどのように再パッケージ化されますか?
- 19. gccの拡張asmで呼び出されたsystemcallによって変更されたレジスタ
- 20. リファレンスをポインタに正しく変換するにはどうすればよいですか?
- 21. 私はASMは、単純にそうように見える、C++にASMからいくつかのコードを変換していますC++
- 22. Androidのグループ名はどのように変換されますか?
- 23. 複数のバイト値はどのように変換されますか?
- 24. Jqueryは流星でどのように変換されますか?
- 25. は、どのように私はgccの
- 26. は、どのように私はgccの
- 27. gccの-pgフラグはどのように機能しますか?
- 28. GCCのコードカバレッジオプションはどのように機能しますか?
- 29. T-SQLへの変換文字列はどのように変換されますか?
- 30. どのように変数のリファレンスをjavascriptで与えますか?
簡単なテストプログラムを作成し、異なるコンパイラでビルドし、生成されたコードを調べてみましょう。 –
複雑な状況が異なる可能性があります。 – ska
コンパイラが参照された項目のエイリアスとして扱うことができるため、生成されたコードに存在する必要がないことがあります。 –