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;
...