Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Rujukan Sebenarnya Dilaksanakan dalam C?

Bagaimanakah Rujukan Sebenarnya Dilaksanakan dalam C?

Susan Sarandon
Susan Sarandonasal
2024-11-26 09:02:14191semak imbas

How Are References Actually Implemented in C  ?

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:

  • Rujukan biasanya dilaksanakan sebagai penunjuk kepada objek yang dirujuk.
  • Rujukan boleh merujuk kepada kedua-dua pembolehubah tempatan dan global.
  • Petunjuk dan rujukan selalunya boleh ditukar ganti.

Contoh Program dan Output Pengkompil

Untuk menunjukkan pelaksanaan dalaman rujukan, pertimbangkan program berikut:

#include <stdio.h>
#include <stdlib.h>

int byref(int &amp;foo) { printf("%d\n", foo); }
int byptr(int *foo) { printf("%d\n", *foo); }

int main() {
  int aFoo = 5;
  byref(aFoo);
  byptr(&amp;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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn