2015-07-20 21 views
13
int x = 10; 
int& y = x; 

Đối với điều này, x được phân bổ là 2/4/8 byte trên ngăn xếp và 00 ... 1010 được ghi vào các byte đó. Bố trí bộ nhớ và nội dung của nó trông như thế nào cho y?Tham chiếu được mã hóa bằng C++ như thế nào?

+4

Không bao giờ giả sử đó là bốn byte. Nó có thể là tám. Tài liệu tham khảo, * về mặt lý thuyết *, chỉ là sự tiện lợi cho lập trình viên. Trong trường hợp này 'x' và' y' cũng giống nhau, chỉ có các tên khác nhau. Trong thực tế, ai biết được. Có thể có nhiều bản sao của '10' nếu trình biên dịch nghĩ rằng đó là hữu ích. Hãy nhớ rằng, * biến * không bao giờ chiếm không gian bộ nhớ, chỉ các giá trị mà chúng đại diện làm. – tadman

+7

AFAIK tiêu chuẩn C++ chỉ quy định rằng tham chiếu phải là bí danh đối tượng khác và không yêu cầu nó phải được triển khai theo bất kỳ cách nào cụ thể, vì vậy bạn không nên dựa vào điều này. – Borgleader

+3

@Borgleader Đó là sự thật, mặc dù chúng hoạt động rất giống như con trỏ tự động dereferencing liên tục – KABoissonneault

Trả lời

27

Từ C++ 11 tiêu chuẩn 8.3.2.4 [dcl.ref]

Nó được xác định có hay không một tài liệu tham khảo cần lưu trữ

Vì vậy, có thể hoặc không cần bất kỳ bộ nhớ nào.

13

Hãy để tôi trích dẫn http://en.cppreference.com/w/cpp/language/reference:

Tài liệu tham khảo không phải là đối tượng; chúng không nhất thiết chiếm dung lượng lưu trữ, mặc dù trình biên dịch có thể cấp phát bộ nhớ nếu cần thiết thực hiện ngữ nghĩa mong muốn (ví dụ: thành viên dữ liệu không tĩnh của loại tham chiếu thường làm tăng kích thước của lớp theo số tiền cần thiết để lưu trữ một địa chỉ bộ nhớ)

+0

damn, bạn đánh bại tôi với nó :) – ydobonebi

4

Từ quan điểm của C++ languange, nó không được xác định.

Trong thực tế, trình biên dịch thường xử lý các tham chiếu theo cách hoàn toàn giống như con trỏ, mặc dù chúng có nhiều thuộc tính khác nhau trong C++. Nó có nghĩa là địa chỉ của biến được tham chiếu được lưu trữ vật lý. Có lẽ giả định duy nhất mà trình biên dịch có thể thực hiện là tham chiếu không phải là null. Mặc dù vậy, tôi nghĩ rằng bạn không thể truy cập vào địa chỉ được lưu trữ trong biến tham chiếu trong mã C++ mà không cần dùng con trỏ trước.

Lưu ý rằng trình biên dịch thường có thể tối ưu hóa biến tham chiếu để bạn thậm chí không thể nói vị trí của nó trong assembly. Và nó có thể làm tương tự với các biến con trỏ.

+1

Đừng quên rằng tài liệu tham khảo có thể kéo dài tuổi thọ; trong những trường hợp này, bộ nhớ sẽ dành cho toàn bộ đối tượng: { Đối tượng & my_object = Object(); // my_object sống cho toàn bộ khối } – Lucretiel

+0

Bạn có chắc chắn các tham chiếu có thể kéo dài tuổi thọ vượt quá một biểu thức duy nhất không? Điều đó nhìn tôi như thể nó sẽ là một tham chiếu lơ lửng. –

+0

@Lucretiel [không làm điều đó] (http://stackoverflow.com/questions/13826897/why-not-non-const-reference-to-temporary-objects) – NathanOliver

Các vấn đề liên quan