2012-03-30 20 views
16

Tôi đã luôn luôn tò mò, tại sao chức năng time(time_t *) cả hai trả về một time_t và đặt thời gian cho con trỏ được truyền?Tại sao thời gian (time_t *) hoạt động trở lại và đặt by-ref?

Ví dụ về trở về thời gian:

time_t myTime = time(NULL); 
printf("The time is now %s", ctime(&myTime)); 

Ví dụ về cách thiết lập các giá trị cho con trỏ:

time_t myTime; 
time(&myTime); 
printf("The time is now %s", ctime(&myTime)); 

Tôi ban đầu nghĩ sẽ có một hiệu suất đạt được bằng cách viết vào bộ nhớ thay vì trả lại , nhưng nếu nó phải làm cả hai, không phải là chỉ làm cho nó chậm hơn?

Trả lời

16

Không có lợi ích thực sự trong cách nó hiện đang được xác định .

Tôi nghi ngờ rằng khi hàm time() được xác định trước, nó đã sử dụng loại không thể trả về từ một hàm. Việc triển khai C rất sớm không có long int và không thể trả về cấu trúc từ các hàm. Trên một hệ thống có int int 16 bit, cách duy nhất để biểu diễn một thời gian sẽ là một cấu trúc hoặc như một mảng; 16 bit giá trị của giây là ít hơn một ngày.

triển khai Vì vậy, sớm time() có thể đã được sử dụng một cái gì đó như thế này (dự đoán):

time_t now; 
time(&now); /* sets now.time_high, now.time_low */ 

hoặc có lẽ:

int now[2]; 
time_t(now); /* sets now[0], now[1] */ 

Khi sau C triển khai thêm các số nguyên dài hơn và khả năng quay trở lại cấu trúc theo giá trị, khả năng trả về giá trị time_t từ chức năng time() đã được thêm vào, nhưng chức năng cũ được giữ để tránh vi phạm mã hiện tại.

Tôi nghĩ rằng nếu time() đã được định nghĩa ngày hôm nay, nó sẽ trông như thế này:

time_t time(void); 

tôi đã không thể xác nhận rằng việc triển khai cũ của time() chức năng làm việc theo cách này (thử Googling " thời gian "!), nhưng nó có ý nghĩa cho lịch sử của ngôn ngữ.

Nếu bạn chuyển một con trỏ rỗng tới hàm time(), nó trả về thời gian hiện tại mà không lưu trữ nó trong một biến; điều này tránh một số hình phạt về hiệu suất:

time_t now = time(NULL); 
+0

Điều đó nghe có vẻ hợp lý. Tôi đã mong đợi các hình phạt hiệu suất để đi theo cách khác. Nó tránh được nếu bạn vượt qua một NULL, nhưng nếu bạn gọi nó với một con trỏ và bỏ qua kết quả trả về, nó vẫn phải xô thời gian vào thanh ghi trả về. Đôi khi tôi quên rằng C gần gấp đôi tuổi như tôi. :) – wjl

+2

* Thỉnh thoảng tôi quên rằng C gần gấp đôi tuổi tôi. * - Cảm ơn đã khiến tôi cảm thấy mình già đi! số 8-)} –

7

Nó cho phép bạn tổ một cuộc gọi đến time() trong biểu hiện khác, thay vì làm việc đó trong một tuyên bố riêng biệt:

time_t x = time(&now) + more_time; 

Khi kết thúc tuyên bố trên, now nên chứa thời điểm hiện tại, và x nên chứa thời gian hiện tại cộng với một số giá trị.

strcpy rơi vào trường hợp tương tự vì nó sẽ trả về cùng char * con trỏ đã được thông qua như là điểm đến của nó, vì vậy làm tổ nó có thể là tốt:

printf("Copied string is %s", strcpy(dst, src)); 
+3

Nếu 'time()' không có đối số, điều đó có thể dễ dàng thực hiện bằng cách lồng một nhiệm vụ: 'time_t x = (now = time())' + more_time ' –

+3

Trong khi tôi đồng ý với Keith, câu trả lời này là câu đầu tiên tôi thấy để cung cấp khả năng sử dụng thuận tiện cho chữ ký lẻ của' time' ... –

+0

Tôi nghĩ trong cả hai trường hợp, tốt hơn nên sử dụng hai dòng vì lợi ích dễ đọc. Nó có thể biên dịch xuống cùng một điều theo một trong hai cách. – wjl

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