2017-01-06 15 views
6

Trong số C++ Core Guidelines, Bjarne Stroustrup đề xuất sử dụng span khi truyền mảng bằng tham chiếu. Tại sao không chỉ vượt qua một đối tượng mảng :: std?Sự khác nhau giữa khoảng thời gian đi qua <T> và std :: mảng làm đối số là gì?

+4

Có lẽ để đơn giản và tránh mã bloat từ mẫu bạn cần sử dụng để chấp nhận bất kỳ kích thước 'std :: array' nào. – NathanOliver

+3

Nguyên tắc cốt lõi không thuộc sở hữu của Stroustrup. –

Trả lời

10
  1. Đi qua std::array bởi giá trị sẽ là sao chép họ. Điểm của gsl::span là chức năng lấy chúng là tham chiếu một mảng dữ liệu hiện có.

  2. gsl::span có khả năng lấy mảng các kích thước được xác định theo thời gian chạy. std::array được cố định tại thời gian biên dịch.

  3. gsl::span không quan tâm loại sở hữu mảng; nó chỉ là một con trỏ + kích thước. Vì vậy, giao diện dựa trên span có thể được cung cấp dữ liệu từ std::vector, QVector và nhiều loại khác. Giao diện dựa trên std::arrayyêu cầu bạn sử dụng vùng chứa cụ thể đó.

+0

Cảm ơn! Trên một lưu ý tương tự, tại sao không vượt qua một iterator bắt đầu và kết thúc như là đối số? –

+1

Vì đó sẽ là hai tham số. Nó cũng sẽ yêu cầu hàm của bạn là một hàm * template *. Các hàm nhận các cặp lặp có thể hoạt động trên nhiều phạm vi khác nhau, bao gồm trong nhiều trường hợp trình lặp dòng. Các hàm hoạt động trên 'spans' có thể * chỉ hoạt động * trên một mảng giá trị liền kề. –

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