2009-11-20 3 views
12

Dường như trong C++ và D, các ngôn ngữ được biên dịch tĩnh và trong đó lập trình meta mẫu là một kỹ thuật phổ biến, có một số lượng đáng quan ngại về bloat instantiation mẫu. Dường như với tôi giống như hầu hết là một mối quan tâm lý thuyết, ngoại trừ trên các hệ thống nhúng rất hạn chế về tài nguyên. Bên ngoài không gian được nhúng, tôi chưa nghe một ví dụ về ai đó có thể chứng minh rằng đó là một vấn đề trong thực tế.Khi nào thì mẫu instantiation bloat quan trọng trong thực tế?

bất cứ ai có thể cung cấp một ví dụ ngoài hệ thống nhúng nghiêm trọng tài nguyên hạn chế về nơi mẫu instantiation sưng lên mattered trong thực tế và có đo lường được, thực tế đáng kể tác động tiêu cực?

Trả lời

10

Có rất ít vấn đề trong C++, vì số lượng mẫu nội dung bạn có thể làm trong C++ bị giới hạn bởi sự phức tạp của chúng.

Trong D tuy nhiên ... trước khi CTFE (đánh giá chức năng biên dịch thời gian) tồn tại, chúng tôi đã phải sử dụng mẫu để xử lý chuỗi . Đây cũng là lý do các biểu tượng bị xáo trộn lớn được nén trong DMD - các chuỗi được sử dụng làm các đối số mẫu trở thành một phần của tên biểu tượng bị xâu xé, và khi tạo mẫu với đoạn mã dài hơn (ví dụ) .

Hôm nay tốt hơn. Nhưng về tổng thể, các mẫu vẫn gây ra rất nhiều bloat vì một lý do đơn giản - chúng phân tích nhanh hơn và mạnh hơn trong C++, vì vậy mọi người tự nhiên sử dụng chúng nhiều hơn (ngay cả trong trường hợp về mặt kỹ thuật sẽ không cần mẫu) . Tôi phải thừa nhận tôi là một trong những phạm nhân chính ở đây (hãy xem tools.base nếu bạn thích, nhưng hãy chắc chắn để giữ một túi barf tiện dụng - các tập tin có hiệu quả 90% mẫu mã).

3

Tôi nghĩ bạn sẽ cần phải tìm một trình biên dịch cũ hơn để xem mã mẫu bloat trong thực tế. Các trình biên dịch C++ hiện đại (và các trình liên kết) đã có thể tối ưu hóa nó một lúc.

2

Tôi nghĩ rằng nó chủ yếu là sưng lên tinh thần. Các lập trình viên tiếp theo để làm việc trên mã của bạn trước tiên sẽ cần phải tìm ra những tập hợp con của nó quan trọng.

7

Bloat mẫu là NOT một vấn đề (Đó là vấn đề về tinh thần không phải là vấn đề về mã).

Có thể phát triển lớn. Nhưng thay thế là gì?
Bạn có thể tự viết tất cả mã (một lần cho mỗi loại). Bạn có nghĩ rằng viết nó bằng tay sẽ làm cho nó nhỏ hơn. Trình biên dịch chỉ instanciate các phiên bản nó thực sự cần và linker sẽ loại bỏ nhiều bản sao lây lan trên các đơn vị biên dịch.

Vì vậy, không có bloat thực tế.
Nó chỉ là xây dựng những gì bạn sử dụng. Nếu bạn sử dụng nhiều loại khác nhau, bạn cần phải viết nhiều mã hơn.

+2

Điều đó không hoàn toàn đúng - trình biên dịch có thể tạo mã giống hệt nhau cho các hàm khác nhau 'f (int int)' và 'f (unsigned int)', và probabl y sẽ không nhận thấy rằng chúng giống hệt nhau. Trong khi viết nó bằng tay bạn sẽ chỉ nhận được một trong những chức năng đó. –

+2

Lý tưởng nhất là bạn nên sử dụng trình biên dịch/trình liên kết nhận dạng và loại bỏ mã lắp ráp được tạo trùng lặp. Visual Studio làm điều đó (COMDAT gấp). – vividos

+3

Điều này đúng nếu bạn chỉ sử dụng mẫu làm generics. Nhưng điều đó không đúng nếu bạn đang thực hiện lập trình meta bằng các mẫu. Các mẫu được sử dụng trong lập trình meta có thể tạo ra tất cả các loại kiểu trung gian điên rồ mà bạn không thực sự cần. Tôi nghĩ rằng boost :: generator parser tinh thần có thể là một ví dụ tốt về điều này. – Baxissimo

1

Phấn màu tức thì mẫu là một vấn đề trong thực tế, bởi vì nó có thể tăng (rất nhiều !!!) biên dịch và liên kết thời gian.

Tôi personnaly nghĩ rằng vấn đề C++ # 1 là thời gian biên dịch và chủ yếu là do mẫu.

Tôi đã làm việc trên một dự án với khoảng 50 libs. Chúng tôi đã có hệ thống rtti của riêng mình bằng cách sử dụng các mẫu.Tôi đã phải viết lại vì mẫu sưng lên

Dưới đây là một vài con số:

  • libs đi từ 640 Mbytes tới 420 Mbytes
  • temps đi từ 4,3 GBytes đến 2,9 GBytes
  • đầy đủ xây dựng lại đi từ 19:30 đến 13:10
+0

lý do bỏ phiếu xuống ??? – benoitj

+0

nghe giống như một "dự án trò chơi";) bằng cách nào đó hầu hết các trò chơi PC đều gặp phải vấn đề đó và thường các nhà phát triển phát hiện sự cố trong các mẫu. Nhưng trong thực tế, vấn đề chỉ là sự bùng nổ mã chung và vô trách nhiệm ném nhiều hơn và nhiều hơn nữa libs vào điều này. mã bloat được tạo ra bởi mã mẫu thường chỉ là vật tế thần. – Frunsi