2012-01-18 35 views
6

Tôi đã xem GCC STL (4.6.1) và thấy rằng std::copy() sử dụng phiên bản được tối ưu hóa trong trường hợp mã được gắn sẵn __is_trivial() đánh giá là true.std :: sao chép/memcpy/memmove tối ưu hóa

Vì mẫu std::copy()std::reverse_copy() rất hữu ích cho việc sao chép các phần tử trong mảng, tôi muốn sử dụng chúng. Tuy nhiên, tôi có một số kiểu (là kết quả của các mẫu instantiations) là các cấu trúc có chứa một số giá trị tầm thường, không có con trỏ và không có hàm tạo bản sao hoặc toán tử gán.

G ++ có đủ thông minh để nhận ra rằng loại của tôi trên thực tế là tầm thường không? Có cách nào trong C + + 98 để đảm bảo thực hiện STL biết rằng loại của tôi là tầm thường?

Tôi đoán rằng trong C++ 11, mọi thứ sẽ trở nên thuận tiện khi sử dụng đặc tính loại is_trivial<>. Thê nay đung không?

Cảm ơn!

EDIT: Xin lỗi vì đã quá muộn với điều này, nhưng đây là ví dụ về lớp học đơn giản Type không đơn giản với GCC và llvm. Bất kỳ ý tưởng?

#include <iostream> 

struct Spec; 

template <typename TValue, typename TSpec> 
class Type 
{ 
public: 
    TValue value; 

    Type() : value(0) {} 
}; 

int main() 
{ 
    std::cerr << "__is_trivial(...) == " 
       << __is_trivial(Type<char, Spec>) << '\n';                                                          
    return 0; 
} 
+3

C++ 03 POD cũng bỏ qua các nhà xây dựng mặc định nếu tôi nhớ lại, điều này có thể ngăn cản điều đó trở nên tầm thường. –

+0

@MooingDuck: Cảm ơn, tôi nghĩ đó là lời giải thích. Cùng với câu trả lời của Mathieu, câu trả lời này trả lời cho câu hỏi của tôi. – Manuel

Trả lời

5

Đã có một số cuộc tranh luận về ý nghĩa của trivial.

Ví dụ: ví dụ của bạn không thể xây dựng một cách trivially theo như tôi có thể nói (std::is_trivially_default_constructible sẽ trả về false tôi nghĩ).

Trong trường hợp của bạn, tôi nghĩ rằng bạn sẽ cần đặc điểm mới std::is_trivially_copyable, đó là hạt mịn hơn. Vậy ... nâng cấp trình biên dịch của bạn?

4

__is_trivial cung cấp đúng giá trị cho tất cả các loại.

Bạn không thể dựa vào bất kỳ triển khai STL paticular nào để sử dụng nó, mặc dù nếu nhà cung cấp trình biên dịch cung cấp nó thì nó có thể chứa nhiều cải tiến trình biên dịch cụ thể đằng sau hậu trường.

C++ 11's std::is_trivial chỉ đơn thuần là chuẩn hóa tính năng này, không có lý do gì để triển khai không sử dụng tính năng này.

+0

Rõ ràng, '__is_trivial' không thể suy luận xem một loại có thể sao chép một cách không đáng kể. :(Xem ví dụ trong bản cập nhật của tôi. – Manuel