Hoàn toàn có thể là Eigen chỉ là một thư viện được viết khủng khiếp (hoặc chỉ kém suy nghĩ); chỉ vì một cái gì đó là trực tuyến không làm cho nó đúng. Ví dụ:
Chuyển đối tượng theo giá trị hầu như luôn là một ý tưởng rất tồi trong C++, vì điều này có nghĩa là các bản sao vô dụng và chúng sẽ chuyển chúng theo tham chiếu thay thế.
Đây không phải là lời khuyên tốt nói chung, tùy thuộc vào đối tượng. Đôi khi cần thiết trước C++ 11 (vì bạn có thể muốn một đối tượng không thể sao chép được), nhưng trong C++ 11, nó là không bao giờ cần. Bạn vẫn có thể làm điều đó, nhưng không bao giờ cần thiết để luôn chuyển giá trị theo tham chiếu. Bạn chỉ có thể di chuyển nó theo giá trị nếu nó chứa bộ nhớ được cấp phát hoặc cái gì đó. Rõ ràng, nếu đó là một loại "nhìn-nhưng-không-chạm", const&
là tốt.
Đối tượng cấu trúc đơn giản, có lẽ là số Vector2d
của Eigen có thể đủ rẻ để sao chép (đặc biệt là ở x86-64, trong đó con trỏ là 64 bit) sao chép không có ý nghĩa nhiều về hiệu suất. Đồng thời, nó là trên không (theo lý thuyết), vì vậy nếu bạn đang ở trong mã quan trọng hiệu suất, nó có thể giúp đỡ.
Sau đó, một lần nữa, nó có thể không.
Vấn đề tai nạn cụ thể mà Eigen dường như đang nói đến liên quan đến việc căn chỉnh đối tượng. Tuy nhiên, hầu hết sự hỗ trợ liên kết của trình biên dịch C++ 03 đảm bảo rằng sự liên kết trong mọi trường hợp. Vì vậy, không có lý do gì nên "làm cho chương trình của bạn sụp đổ!". Tôi chưa bao giờ thấy một thư viện dựa trên SSE/AltaVec/etc sử dụng các khai báo liên kết cụ thể của trình biên dịch gây ra sự cố với các tham số giá trị. Và tôi đã sử dụng khá nhiều.
Vì vậy, nếu họ đang gặp phải một số vấn đề trục trặc với điều này, thì tôi sẽ xem xét Eigen là ... công đức đáng ngờ. Không phải điều tra thêm.
Ngoài ra, nếu một đối tượng không an toàn để truyền theo giá trị, như các tài liệu Eigen đề xuất, thì cách thích hợp để xử lý điều này sẽ làm cho đối tượng không thể sao chép được. Việc gán bản sao sẽ ổn, vì nó yêu cầu một đối tượng đã tồn tại. Tuy nhiên, Eigen không làm điều này, điều này một lần nữa gợi ý rằng các nhà phát triển đã bỏ lỡ một số điểm thiết kế API tốt hơn.
Tuy nhiên, đối với bản ghi, C++ 11 có từ khóa alignas
, đây là cách tiêu chuẩn để khai báo rằng đối tượng phải có một căn chỉnh nhất định.
Ngoài ra, tại sao không có vấn đề với trả lại các đối tượng đó theo giá trị?
Ai nói rằng không có (chú ý vấn đề sao chép, chứ không phải vấn đề căn chỉnh)? Sự khác biệt là bạn không thể trả lại giá trị tạm thời theo tham chiếu. Vì vậy, họ không làm điều đó bởi vì nó không thể.
Bạn đã xem ['std :: aligned_storage <>'] (http://en.cppreference.com/w/cpp/types/aligned_storage) chưa? – ildjarn
Tôi chưa bao giờ nghe nói về một đối tượng không thể được truyền theo giá trị, và sẽ xem xét một đối tượng như vậy được thiết kế kém. Tôi tự hỏi tại sao Eigen lại làm vậy? –
@ildjarn: Bây giờ tôi có :) Bạn có thể giải thích cách nó ảnh hưởng đến việc chuyển một loại theo giá trị? –