2012-12-20 4 views
6

Một số blog và trang web đã nói về con trỏ là một trong những nguyên nhân có lợi vì "tốc độ thực thi" sẽ tốt hơn trong chương trình có con trỏ hơn là không có con trỏ. Điều tôi có thể giải quyết là:Con trỏ và tốc độ thực thi

  • Dereferencing một địa điểm duy nhất yêu cầu hai (hoặc nhiều) truy cập bộ nhớ (tùy thuộc vào số lần gián tiếp). Mà sẽ tăng thời gian thực hiện, so với nếu nó được sử dụng trực tiếp.

  • Chuyển con trỏ đến một kiểu dữ liệu lớn cho hàm, như cấu trúc có thể có lợi, vì chỉ địa chỉ của cấu trúc/liên kết được sao chép và nó không được truyền theo giá trị. Do đó, nó sẽ nhanh hơn trong trường hợp này.

Ví dụ chỉ bằng vũ lực đưa con trỏ mà không cần phải như:

int a, b, *p, *q, c, *d; 
p = &a; 
q = &b; 
d = &c 

// get values in a, b 

*d = *p + *q; // why the heck this would be faster 
c = a + b;  // than this code? 

Tôi đã kiểm tra đầu ra lắp ráp sử dụng gcc -S -masm=intel file.c Phiên bản con trỏ có rất nhiều bộ nhớ tải và lưu trữ cho dereferences so với trực tiếp phương pháp.

Tôi có thiếu gì đó không?

Lưu ý: Câu hỏi không liên quan đến mã. Mã chỉ là một ví dụ. Không xem xét tối ưu hóa trình biên dịch.

+1

"Có lợi" hoặc "tốt hơn" chỉ có thể được sử dụng so sánh một điều với một thứ khác. Vì vậy, câu hỏi là với những gì tác giả đã so sánh tốc độ thực thi. Liên quan đến cấu trúc truyền quastruct con trỏ, con trỏ được nhanh hơn - nếu cấu trúc tương ứng không được sử dụng nhiều. Liên quan đến những thứ khác, nó phụ thuộc rất nhiều. – glglgl

+0

Trong trường hợp tốt nhất, cả hai phiên bản đều tương đương vì trình biên dịch có thể đã bị coi trọng nếu các kiểu liên quan được biết. Hãy thử biên dịch ví dụ của bạn bằng '-O2' và xem cách con trỏ được tối ưu hóa như thế nào. – matthias

+0

Không xem xét tối ưu hóa trình biên dịch, điểm chính của câu hỏi là nếu sử dụng con trỏ luôn tăng tốc độ thực thi cho một số lý do "huyền diệu"? Hoặc các con trỏ nên được coi như các biến bình thường chứa một số nguyên mà chúng ta dự định sử dụng như một địa chỉ bộ nhớ, và theo một số cú pháp, chúng ta sẽ biết các trình biên dịch chúng ta sẽ sử dụng để giữ các giá trị như vậy. – phoxis

Trả lời

6

Tôi nghĩ rằng kết luận của bạn về cơ bản là đúng. Tác giả không có nghĩa là sử dụng nhiều con trỏ hơn sẽ luôn tăng tốc tất cả các mã. Điều đó rõ ràng là vô nghĩa.

Nhưng có những lúc chuyển dữ liệu con trỏ đến dữ liệu nhanh hơn thay vì sao chép dữ liệu đó.

1

Như bạn đã chỉ ra: Chuyển con trỏ đến một kiểu dữ liệu lớn đến hàm; ở đây cấu trúc là int, vì vậy nó hầu như không lớn. BTW: Tôi đoán gcc sẽ tối ưu hóa việc truy cập con trỏ khi bạn sử dụng -O2.

Ngoài ra, sự hiểu biết của bạn là chính xác.

+0

Không xem xét bất kỳ loại tối ưu hóa trình biên dịch nào, nó chỉ là một ví dụ. Hãy xem xét nó là bên trong một hàm. – phoxis

-1

Mark Byers là hoàn toàn đúng. Bạn không thể đánh giá sức mạnh của con trỏ trong chương trình đơn giản như vậy. Chúng được sử dụng để tối ưu hóa việc quản lý bộ nhớ và thực hiện nhanh hơn các chương trình có sử dụng quá nhiều cấu trúc dữ liệu và tham chiếu được thực hiện thông qua các địa chỉ. Hãy xem xét khi bạn bắt đầu một chương trình phải mất một thời gian để tải nhưng với việc sử dụng hiệu quả các con trỏ và kỹ năng nếu chương trình tải ngay cả 1 giây trước đó là một thành tựu lớn.

+0

Câu hỏi nói chung, mã là một ví dụ. – phoxis

1

Bạn có quyền trong ví dụ của mình - mã đó sẽ chạy chậm hơn. Một nơi mà nó có thể được nhanh hơn là khi thực hiện cuộc gọi chức năng:

void foo(Object Obj); 
void bar(const Object * pObj); 

void main() 
{ 
    Object theObject; 
    foo(theObject); // Creates a copy of theObject which is then used in the function. 
    bar(&theObject); // Creates a copy of the memory address only, then the function references the original object within. 
} 

bar là nhanh hơn khi chúng ta không cần phải sao chép toàn bộ đối tượng (giả sử đối tượng là nhiều hơn chỉ là một kiểu dữ liệu cơ sở). Hầu hết mọi người sẽ sử dụng một tham chiếu chứ không phải là một con trỏ trong trường hợp này, tuy nhiên.

void foobar(const Object & Obj);