2011-10-28 34 views
5

boost::array (hoặc tr1 hoặc std phiên bản) cung cấp một số tính năng bổ sung tốt đẹp hơn một mảng tích hợp sẵn.Có an toàn khi thay thế mảng tích hợp bằng mảng std/tr1/boost :: không?

Đến nay, codebase của chúng tôi chỉ chứa mảng built-in, ví dụ (tạo thành, nhưng phong cách phù hợp):

WORD m_lastReadFlags[FLAGS_MAX]; 
... 
WORD flagBuffer[FLAGS_MAX]; 
if (getFlags(flagBuffer)) { 
    memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags)); 
    ... 

Tôi nghĩ one'll được ý tưởng.

Bây giờ, câu hỏi của tôi là, đối với những địa điểm trong mã, nơi giảm số boost::array sẽ có ý nghĩa (vì các thay đổi khác được thực hiện), là array 100% ngữ nghĩa bảo quản thả cho mảng được tích hợp? (Lỗi biên dịch có thể là OK - thay đổi hành vi chỉ im lặng là những gì đang làm phiền tôi.)

Đó là, thể mã ở trên được viết lại (ví dụ) để sử dụng:

boost::array<WORD, FLAGS_MAX> m_lastReadFlags; 

và memcpy (có thể thích nghi để sử dụng c_array() hoặc data()) và truy cập giống như mảng khác sẽ vẫn giữ nguyên? Có, tất nhiên tôi cũng có thể thay thế bộ đệm cục bộ bằng một mảng và xóa memcpy hoặc sử dụng std::copy hoặc một cái gì đó tương tự, nhưng điểm của câu hỏi này là về khả năng tương thích của các mảng dựng sẵn và lớp mảng.


Cập nhật: Một điều mà làm phiền tôi đặc biệt là những nơi (như trong trường hợp memcpy), nơi các mảng tích hợp được sử dụng như con trỏ. Tất cả các lần xuất hiện có bị chặn bởi trình biên dịch /được xử lý đúng không?

Còn nhiệm vụ thì sao?

T arr1[N]; // or array<T, N> 
T arr2[N]; // or array<T, N> 
T* p1; 
... 
// Note, not all combinations will compile: 
arr1 = arr2; 
p1 = arr1; 
arr2 = p1; 
... 

Trả lời

5

Vâng, điều đó sẽ ổn, vì lớp array chính xác là trình bao bọc cho mảng tự động. Nó có cùng cú pháp truy cập với các dấu ngoặc vuông, và nếu bạn cần lấy con trỏ, bạn biết cách thực hiện nó. Bạn thậm chí có thể sử dụng std::copy ở mọi nơi và sử dụng trình vòng lặp; cơ hội là điều đó sẽ được thực hiện bởi memcpy.

Lớp arrayloại tổng hợp (không có nhà xây dựng/destructor/nhiệm vụ không tầm thường), vì vậy bạn có thể khởi tạo nó bằng trình khởi tạo tổng hợp truyền thống (cú đúp), giống như một mảng đơn giản.

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