2011-07-18 36 views
22

trong C++C++ qua các đối số bằng cách tham chiếu và con trỏ

class bar 
{ 
    int i; 
    char b; 
    float d; 
}; 

void foo (bar arg); 
void foo (bar &arg); 
void foo (bar *arg); 

đây là một mẫu lớp/struct và chức năng
tôi có một số Qs

  • sự khác biệt giữa 1 và cách 2 của đi qua là những gì đối số trong 'asm', kích thước, tốc độ?
  • cách đối số được chuyển đến hàm foo trong mỗi trường hợp (trong trường hợp con trỏ tôi biết con trỏ được đẩy trên ngăn xếp)
  • khi chuyển đối số, về hiệu quả tại (tốc độ, kích thước, độ ưu tiên) tốt hơn ?
  • Cú pháp 'asm' intel tương ứng với mỗi cách truyền đối số là gì?

tôi biết điều gì nói nhiều nhất về "nó không quan trọng trên các trình biên dịch và CPU hiện đại" nhưng điều gì sẽ xảy ra nếu chúng ta đang nói về CPU cũ hoặc trình biên dịch?

cảm ơn trước

+1

CPU sẽ không thành vấn đề. Truyền theo giá trị liên quan đến nhiều công việc hơn cho tất cả các loại nhưng kích thước nhỏ hơn kích thước của một con trỏ. Xem câu trả lời từ cnicutar. –

+0

nó quan trọng trên cpus hiện đại cũng như cpus cũ.Lưu ý rằng x86 là một cpu cũ thậm chí với những cải tiến hiện đại của nó, nó có một số lượng hợp lý của hành lý học cũ mà nó phải mang theo, đặc biệt liên quan đến chủ đề này. cnicutar có một câu trả lời tốt như vậy nó không phải là giá trị lặp đi lặp lại hoặc rephrasing. –

Trả lời

21

Con trỏ và các phương pháp tham khảo nên được khá tương đương nhau (cả về tốc độ, sử dụng bộ nhớ và mã được tạo).

Chuyển lớp trực tiếp buộc trình biên dịch sao chép bộ nhớ và đặt một bản sao của đối tượng bar trên ngăn xếp. Điều gì tệ hơn, trong C++ có tất cả các loại bit khó chịu (constructor sao chép mặc định và whatnot) liên kết với điều này.

Trong C, tôi luôn sử dụng (có thể là const) con trỏ. Trong C++, bạn nên sử dụng các tham chiếu.

+1

Không chỉ so sánh được, mà chính xác là giống nhau. Tham chiếu * chỉ là một * cú pháp * biến thể của một con trỏ *. –

+3

ngoại trừ các khác biệt được đề cập ở đây: http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c –

+2

@edA: Vui lòng cung cấp trích dẫn từ tiêu chuẩn chứng minh "Một tham chiếu chỉ là một biến thể cú pháp của một con trỏ." – fredoverflow

1

Trong bất kỳ cách hợp lý nào, việc tham chiếu có thể dẫn đến mã liên quan đến địa chỉ của các đối tượng. Tuy nhiên, vấn đề chính là sử dụng tài liệu tham khảo có nhiều thành phần C++ và nên là kiểu ưa thích; bạn thực sự không nên nhìn thấy con trỏ thô ở tất cả trong mã của riêng bạn.

Cũng lưu ý rằng việc truyền theo giá trị và tham chiếu về cơ bản là khác nhau theo nghĩa là đi qua tham chiếu cho phép callee sửa đổi đối số. Nếu có, bạn nên so sánh f(bar) với f(const bar &).

1

Con trỏ và tham chiếu khác nhau về cú pháp và thường giống hệt nhau trong thời gian chạy và tạo mã. Đối với các trình biên dịch cũ hơn ... Tôi biết một lỗi trong trình biên dịch Borland 3 C++ DOS: nó lưu trữ một giá trị int (được chuyển bởi tham chiếu) trong thanh ghi, sửa đổi nó và không thay đổi giá trị ban đầu trong bộ nhớ. Khi đi qua con trỏ, một mã tương đương đã hoạt động như mong đợi.

Tuy nhiên, tôi không nghĩ rằng bất kỳ trình biên dịch hiện đại có thể làm những điều kỳ lạ như vậy (và Borland 5 đã khắc phục sự cố)

Như mã phong cách (ngoài con trỏ vs smartpointers cân bằng), tôi thường sử dụng tài liệu tham khảo nếu địa chỉ không thể là NULL theo hợp đồng chức năng, và sử dụng con trỏ khác.

+2

Borland 3? Đó là quá cũ tôi không chắc chắn nó thậm chí còn hỗ trợ màn hình màu. – MSalters

+1

@MSalters: nó hỗ trợ màn hình màu _text_ .. và thậm chí cả tài liệu tham khảo C++ ... theo một số cách cụ thể :) – user396672

0

Chức năng foo có thể sửa đổi arg trong trường hợp 2 và 3. Trong trường hợp đầu tiên trình biên dịch có thể tối ưu hóa tạo bản sao, vì vậy rất khó để so sánh việc sử dụng CPU và bộ nhớ.

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