2009-04-22 39 views
9

Điều này có vẻ giống như một câu hỏi thực sự ngu ngốc, nhưng chi phí bao gồm (thực tế, gọi #import) là một tệp tiêu đề trong Objective-C? Tôi cảm thấy mệt mỏi vì liên tục bao gồm các tiêu đề giống nhau ở các địa điểm khác nhau, vì vậy tôi quyết định chỉ cần tạo một tệp GlobalReferences.h bao gồm một số tiêu đề thường được tham chiếu.Chi phí bao gồm các tệp tiêu đề trong mục tiêu-C

Có bất kỳ chi phí đáng kể nào cho việc bao gồm các tham chiếu đến các tệp khác nếu chúng thậm chí không được sử dụng không? Đường ruột của tôi nói với tôi rằng "không" vì dường như mối liên kết này chỉ được nhận biết về các tệp khác khi sử dụng #import, nhưng tôi không chắc liệu những cân nhắc đặc biệt cần phải được thực hiện để phát triển iPhone hay không. Có suy nghĩ gì không?

Trả lời

7

Trình liên kết không biết gì về các tệp ed. Trong thực tế, trình biên dịch Objective-C cũng không biết gì về chúng, chúng được xử lý trước bởi bộ tiền xử lý. Bộ tiền xử lý có hiệu quả chèn nội dung của các tiêu đề vào điểm mà bạn đã đưa chúng vào tệp nguồn của bạn. Trình biên dịch Objective-C thực tế sau đó sẽ phải xử lý các nguyên mẫu hàm bổ sung và các định nghĩa giao diện lớp mặc dù chúng không được sử dụng. Mặc dù điều này thường không phải là một nhiệm vụ dài, nhưng nó có thể tăng thời gian biên dịch. Kích thước và hiệu suất kết quả của ứng dụng của bạn sẽ không bị ảnh hưởng.

Để xem những gì các mã nguồn liệu trông giống như (bao gồm tất cả các file header và macro mở rộng vv):

gcc -E your-source-file.m 
+0

Cảm ơn bạn đã xóa thanh toán này. – LucasTizma

2

Hạn chế lớn nhất sẽ được trong thời gian biên dịch. Nếu tất cả tiêu đề của bạn được nhập trong mọi tệp nguồn, thì dự án toàn bộ sẽ phải được xây dựng lại mỗi khi bạn thực hiện thay đổi đối với tệp tiêu đề.

3

Nhập/bao gồm nhiều tệp tiêu đề hơn mức bạn cần sẽ tăng thời gian biên dịch. Bạn có thể giảm bớt một số cơn đau này với pre-compiled headers.

0

Đi trước và làm điều đó. Trừ khi các tiêu đề bạn đang bao gồm rất lớn và bạn không sử dụng các tiêu đề được biên dịch sẵn, bạn sẽ không thấy bất kỳ sự khác biệt nào. Như những người khác đã nói, #import là một chỉ thị tiền xử lý. Điều này không có hậu quả thời gian chạy và trong nhiều trường hợp không có hậu quả thời gian biên dịch đáng kể.

+0

Xin cảm ơn tất cả mọi người đã giải thích rõ về vấn đề này. – LucasTizma

1

chi phí bao gồm (thực tế, gọi #import) một tệp tiêu đề trong Mục tiêu-C là bao nhiêu?

Trình biên dịch có thể chạy ra ngoài để đọc những tệp này một cách không cần thiết. Sau khi #import ed, các tệp bổ sung sẽ cần phải được phân tích cú pháp, biên soạn, v.v. cho mỗi bản dịch (ví dụ: .m tệp), nó sẽ hiển thị trong - làm cho thời gian xây dựng và liên kết của bạn dài hơn nhiều. Dài hơn 10 lần là không phải là đáng ngạc nhiên.

Tôi cảm thấy mệt mỏi khi liên tục bao gồm các tiêu đề giống nhau ở các vị trí khác nhau, vì vậy tôi quyết định chỉ cần tạo tệp GlobalReferences.h bao gồm một số tiêu đề thường được tham chiếu.

Thông thường, đó là cách tiếp cận rất xấu. Vấn đề thường gặp là bất cứ khi nào bất kỳ tập tin nào được bao gồm bởi GlobalReferences.h được thay đổi, toàn bộ dự án của bạn và tất cả các phụ thuộc ở giữa sẽ cần phải được xây dựng lại, relinked, vv

Tùy chọn của tôi là tách các chương trình thành các thư viện nhỏ hoặc các gói mà phụ thuộc lẫn nhau này tồn tại (ví dụ: StoreKit.framework là một gói nhỏ/thư viện) - nhưng các thư viện/khung/gói đó không giải quyết được gì. Ngoài ra, các khai báo chuyển tiếp và lưu trữ dữ liệu của bạn trong lớp tiếp tục hoặc @implementation có thể làm giảm đáng kể các phụ thuộc (vì bạn có thể bản địa hoá việc bao gồm một thư viện/tiêu đề chỉ với các bản dịch cần thiết).

Cuối cùng, dọn dẹp sau khi bao gồm lười là rất tốn thời gian, đặc biệt là khi có nhiều và bạn đã đợi cho đến khi thời gian xây dựng của dự án của bạn chậm một cách không thể. Về cơ bản, bạn phải quay trở lại và lấy đi những phụ thuộc không cần thiết, xây dựng lại, lặp lại (trong nhiều ngày).

Có bất kỳ chi phí đáng kể nào để bao gồm các tham chiếu đến các tệp khác nếu chúng thậm chí không được sử dụng không?

Tuyệt đối. Các dự án lớn hơn của bạn phát triển, sự bao gồm lười tệ hơn trở nên tồi tệ hơn. Một vài lười biếng bao gồm trong một dự án lớn có thể thêm hàng chục hoặc hàng trăm nghìn dòng cho hầu hết các tệp đã biên dịch của bạn và có thể kích hoạt việc biên dịch lại thường xuyên nhiều nguồn. Điều này làm tăng thêm sự phức tạp cho quá trình xây dựng - nhu cầu CPU tăng lên, việc sử dụng RAM tăng lên, đĩa IO đi lên ... và một lần nữa, điều này trở thành vấn đề lớn hơn khi các mã/dự án của bạn tăng độ phức tạp.

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