Thông thường, việc trình bày hai cấu trúc đó sẽ giống hệt nhau. Tuy nhiên, có thể có hiệu suất kém nếu bạn chọn sai số cho trường hợp sử dụng của mình.
Ví dụ, nếu bạn cần truy cập mỗi phần tử trong vòng một, với một mảng bạn có thể làm:
for (int i = 0; i < 3; i++)
dosomething(xvec[i]);
Tuy nhiên, không một mảng, bạn muốn hoặc cần phải lặp mã:
dosomething(x);
dosomething(y);
dosomething(z);
Điều này có nghĩa là sao chép mã - có thể theo một trong hai cách. Một mặt có ít mã vòng lặp hơn; Mặt khác các vòng rất chặt chẽ có thể khá nhanh trên các bộ vi xử lý hiện đại, và sự sao chép mã có thể thổi bay bộ đệm I-cache.
Các tùy chọn khác là một chuyển đổi:
for (int i = 0; i < 3; i++) {
int *r;
switch(i) {
case 0: r = &x; break;
case 1: r = &y; break;
case 1: r = &z; break;
}
dosomething(*r); // assume this is some big inlined code
}
này tránh được dấu chân i-cache có thể lớn, nhưng có một tác động hiệu quả tiêu cực rất lớn. Đừng làm thế.
Mặt khác, nó là, về nguyên tắc, có thể cho mảng truy cập chậm hơn, nếu trình biên dịch của bạn không phải là rất thông minh:
xvec[0] = xvec[1] + 1;
dosomething(xvec[1]);
Kể từ xvec [0] và xvec [1] là khác biệt, về nguyên tắc, trình biên dịch phải có khả năng giữ giá trị của xvec [1] trong một thanh ghi, vì vậy nó không phải tải lại giá trị ở dòng kế tiếp. Tuy nhiên, có thể một số trình biên dịch có thể không đủ thông minh để nhận thấy rằng xvec [0] và xvec [1] không bí danh. Trong trường hợp này, việc sử dụng các trường riêng biệt có thể nhanh hơn một chút.
Tóm lại, nó không phải là một hoặc cái kia nhanh trong mọi trường hợp. Đó là về kết hợp các đại diện cho cách bạn sử dụng nó.
Cá nhân, tôi khuyên bạn nên làm theo bất kỳ điều gì làm cho mã hoạt động trên xvec tự nhiên nhất. Nó không có giá trị dành nhiều thời gian của con người đáng lo ngại về một cái gì đó, tốt nhất, có lẽ sẽ chỉ tạo ra một sự khác biệt hiệu suất nhỏ mà bạn sẽ chỉ bắt nó trong tiêu chuẩn vi.
mảng cho phép lặp qua giá trị của chúng, điều này là không thể khi sử dụng thành viên riêng lẻ – Christoph
Bất cứ khi nào bạn có câu hỏi về hiệu suất/hiệu suất, hãy viết một ứng dụng thử nghiệm nhỏ và so sánh. Nếu bạn gặp khó khăn khi giải thích kết quả, hãy đặt câu hỏi. –