Pelaksanaan Rujukan merentas Penyusun dan Konfigurasi
Rujukan dalam C ialah ciri berkuasa yang membolehkan capaian yang cekap kepada memori di luar skop pembolehubah . Tetapi bagaimana ia sebenarnya dilaksanakan di bawah hud?
Syor Standard dan Perbezaan Pelaksanaan
Standard C tidak mewajibkan pelaksanaan khusus untuk rujukan. Walau bagaimanapun, pengkompil biasanya mematuhi garis panduan tertentu:
Contoh Program dan Output Pengkompil
Untuk menunjukkan pelaksanaan dalaman rujukan, pertimbangkan program berikut:
#include <stdio.h> #include <stdlib.h> int byref(int &foo) { printf("%d\n", foo); } int byptr(int *foo) { printf("%d\n", *foo); } int main() { int aFoo = 5; byref(aFoo); byptr(&aFoo); }
Menyusun program ini dengan LLVM dan pengoptimuman dilumpuhkan menghasilkan kod pemasangan yang sama untuk kedua-dua byref dan byptr fungsi:
define i32 @_Z5byrefRi(i32* %foo) { %foo_addr = alloca i32* ; <i32**> [#uses=2] %retval = alloca i32 ; <i32*> [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] store i32* %foo, i32** %foo_addr %0 = load i32** %foo_addr, align 8 ; <i32*> [#uses=1] %1 = load i32* %0, align 4 ; <i32> [#uses=1] %2 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %1) ; <i32> [#uses=0] br label %return return: ; preds = %entry %retval1 = load i32* %retval ; <i32> [#uses=1] ret i32 %retval1 } define i32 @_Z5byptrPi(i32* %foo) { %foo_addr = alloca i32* ; <i32**> [#uses=2] %retval = alloca i32 ; <i32*> [#uses=1] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] store i32* %foo, i32** %foo_addr %0 = load i32** %foo_addr, align 8 ; <i32*> [#uses=1] %1 = load i32* %0, align 4 ; <i32> [#uses=1] %2 = call i32 (i8*, ...)* @printf(i8* noalias getelementptr inbounds ([4 x i8]* @.str, i64 0, i64 0), i32 %1) ; <i32> [#uses=0] br label %return return: ; preds = %entry %retval1 = load i32* %retval ; <i32> [#uses=1] ret i32 %retval1 }
Dalam kod pemasangan ini, kedua-dua fungsi menggunakan arahan yang sama untuk memuatkan dan membatalkan rujukan pembolehubah input foo. Ini menunjukkan bahawa pengkompil memperlakukan kedua-dua rujukan dan penunjuk secara serupa di bawah hud.
Kesimpulan
Rujukan dan penunjuk adalah konsep yang berkait rapat dalam C . Walaupun piawaian tidak menetapkan pelaksanaan tertentu, pengkompil biasanya melaksanakan rujukan sebagai petunjuk. Ini membolehkan penggunaan rujukan dan penunjuk yang cekap dan boleh ditukar ganti untuk mengakses memori di luar skop pembolehubah.
Atas ialah kandungan terperinci Bagaimanakah Rujukan Sebenarnya Dilaksanakan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!