Nó có hiệu suất hơn không?
Nó phải giống hệt nhau. Theo định nghĩa, nó là một tập hợp đơn giản chứa một mảng là thành viên duy nhất của nó.
Tình hình có vẻ phức tạp hơn, vì std::array
không phải lúc nào cũng tạo ra mã lắp ráp giống hệt nhau so với mảng C tùy thuộc vào nền tảng cụ thể.
Tôi đã thử nghiệm tình huống cụ thể này trên chốt chặn :
#include <array>
void test(double* const C, const double* const A,
const double* const B, const size_t size) {
for (size_t i = 0; i < size; i++) {
std::array<double, 2> arr = {0.e0};
for (size_t j = 0; j < size; j++) {
arr[0] += A[i] * B[j];
arr[1] += A[j] * B[i];
}
C[i] += arr[0];
C[i] += arr[1];
}
}
GCC và Clang tạo ra mã lắp ráp giống hệt nhau cho cả phiên bản C-array và std::array
phiên bản.
Tuy nhiên, MSVC và ICPC tạo ra mã lắp ráp khác nhau cho mỗi phiên bản mảng. (Tôi đã kiểm tra ICPC19 với -Ofast
và -Os
; MSVC -Ox
và -Os
)
Tôi không biết tại sao lại như vậy (tôi thực sự mong đợi hành vi giống hệt nhau của std :: array và c-array). Có thể có các chiến lược tối ưu hóa khác nhau được sử dụng.
Nói thêm một chút: Có vẻ như có một lỗi trong ICPC với
#pragma simd
để vector hóa khi sử dụng mảng c trong một số trường hợp (mã mảng c tạo ra kết quả sai; std::array
phiên bản hoạt động tốt).
Thật không may, tôi chưa có một ví dụ làm việc tối thiểu cho điều đó, vì tôi đã phát hiện ra vấn đề đó trong khi tối ưu hóa một đoạn mã khá phức tạp.
Tôi sẽ gửi một báo cáo lỗi cho intel khi tôi chắc chắn rằng tôi không chỉ hiểu sai điều gì đó về C-array / std::array
and #pragma simd
.