Thứ tự của các thành viên trong kiến trúc nhị phân của các đối tượng của một lớp bằng cách nào đó có tác động đến hiệu năng của các ứng dụng sử dụng lớp đó? và tôi tự hỏi làm thế nào để quyết định thứ tự các thành viên của POD trong trường hợp câu trả lời là có bởi vì lập trình viên xác định thứ tự của các thành viên thông qua thứ tự của các tuyên bố của họThứ tự của các thành viên của các đối tượng trong lớp có ảnh hưởng gì đến hiệu suất không?
Trả lời
Tuyệt đối. C++ đảm bảo rằng thứ tự của các đối tượng trong bộ nhớ giống như thứ tự khai báo, trừ khi bộ định danh truy cập can thiệp.
Đối tượng nằm liền kề có nhiều khả năng nằm trên cùng một đường dẫn, do đó, một truy cập bộ nhớ sẽ tìm nạp cả hai (hoặc xóa cả hai từ bộ nhớ cache). Hiệu quả bộ nhớ cache cũng có thể được cải thiện vì tỷ lệ dữ liệu hữu ích bên trong nó có thể cao hơn. Nói một cách đơn giản, địa phương không gian trong mã của bạn dịch sang địa phương không gian để thực hiện.
Ngoài ra, như Jerry ghi chú trong các nhận xét, thứ tự có thể ảnh hưởng đến lượng đệm. Sắp xếp các thành viên bằng cách giảm kích thước, cũng bằng cách giảm sự liên kết (thường xử lý một mảng chỉ là một phần tử thuộc loại của nó và thành viên cấu trúc là thành viên được căn chỉnh nhất của nó). Đệm không cần thiết có thể làm tăng tổng kích thước của cấu trúc, dẫn đến lưu lượng bộ nhớ cao hơn.
C++ 03 §9/12:
dữ liệu không tĩnh thành viên của một (phi đoàn) lớp tuyên bố mà không có một can thiệp access-specifier được phân bổ để các thành viên sau có địa chỉ cao hơn trong một đối tượng lớp . Thứ tự phân bổ thành viên dữ liệu phi tĩnh được ngăn cách bởi một số truy cập-specifier không được chỉ định (11.1). Yêu cầu thực hiện các yêu cầu có thể khiến hai thành viên liền kề không được phân bổ ngay sau mỗi khác; có thể yêu cầu không gian để quản lý các chức năng ảo (10.3) và các lớp cơ sở ảo (10.1).
Hoàn toàn đồng ý với Potatoswatter. Tuy nhiên, cần thêm một điểm nữa về các dòng bộ nhớ cache CPU.
Nếu ứng dụng của bạn đa luồng và các chủ đề khác đọc/ghi các cấu trúc của bạn - điều quan trọng là đảm bảo các thành viên đó là không phải trong cùng một dòng bộ nhớ cache.
Vấn đề là bất cứ khi nào một luồng sửa đổi địa chỉ bộ nhớ được lưu trong bộ nhớ cache trong CPU khác - CPU đó sẽ vô hiệu hóa ngay lập tức dòng bộ nhớ cache chứa địa chỉ đó. Vì vậy, thứ tự thành viên không đúng có thể dẫn đến việc vô hiệu hóa bộ đệm không hợp lệ và suy giảm hiệu suất.
Ngoài việc thực hiện runtime, được mô tả trong các câu trả lời bộ nhớ cache-line liên quan, tôi nghĩ rằng người ta cũng nên xem xét hiệu suất bộ nhớ, ví dụ: kích thước của đối tượng lớp.
Do số padding, kích thước của đối tượng lớp phụ thuộc vào thứ tự khai báo biến thành viên.
Việc kê khai sau có lẽ sẽ mất 12 byte
class foo {
char c1;
int i;
char c2;
}
Tuy nhiên, khi đơn giản lại trật tự của lệnh khai báo thành viên, sau đây có lẽ sẽ mất 8 byte
class bar {
int i;
char c1;
char c2;
}
Trong máy thẳng hàng với các từ 4 byte:
sizeof(foo) = 12
nhưng
sizeof(bar) = 8
- 1. Thứ tự các điều kiện trong mệnh đề WHERE có ảnh hưởng đến hiệu suất của MySQL không?
- 2. Kích thước của tệp jar có ảnh hưởng đến hiệu suất của JVM không?
- 3. Có nhiều dll trong dự án Windows Phone của bạn ảnh hưởng đến hiệu suất không?
- 4. Việc sử dụng lớn các tín hiệu và khe có ảnh hưởng đến hiệu suất của ứng dụng không?
- 5. Các mảnh Android và ảnh hưởng của nó đến hiệu suất
- 6. Các dự án của sinh viên: chúng có ảnh hưởng đến triển vọng việc làm không?
- 7. Khối bắt đầu có ảnh hưởng đến hiệu suất của câu lệnh có điều kiện không?
- 8. Nhận xét có ảnh hưởng đến hiệu suất của Perl không?
- 9. Việc ghim một đối tượng trong LOH có ảnh hưởng đến hiệu năng GC không?
- 10. Biến thành viên tĩnh ảnh hưởng như thế nào đến kích thước đối tượng?
- 11. Việc sử dụng các chức năng ẩn danh có ảnh hưởng đến hiệu suất không?
- 12. Vị trí của khối try-catch có ảnh hưởng đến hiệu suất không?
- 13. Thứ tự của các tham số chuỗi truy vấn có ảnh hưởng đến các đối tượng được lưu trong bộ nhớ cache không?
- 14. Tại sao thứ tự của các vòng trong thuật toán nhân ma trận ảnh hưởng đến hiệu năng?
- 15. Lệnh Sql JOIN có ảnh hưởng đến hiệu năng không?
- 16. lượt xem sqlite3 ảnh hưởng đến hiệu suất?
- 17. Không gian tên có ảnh hưởng đến thứ tự khởi tạo trong C++ không?
- 18. Thứ tự của mixin ảnh hưởng đến lớp dẫn xuất như thế nào?
- 19. Các ứng dụng khác có ảnh hưởng đến hiệu suất ứng dụng của tôi trên iOS không?
- 20. Tìm các thành viên chung của hai đối tượng Javascript
- 21. Thứ tự của các đối tượng CLLocation trong -distanceFromLocation:
- 22. DBMS ảnh hưởng như thế nào đến hiệu suất của ứng dụng? Và các công cụ GUI của Informix?
- 23. Cách sử dụng BigDecimal sẽ ảnh hưởng đến hiệu suất của ứng dụng?
- 24. Các nhánh đóng ảnh hưởng như thế nào đến hiệu suất Mercurial?
- 25. Thay đổi đối tượng đang ảnh hưởng đến các phiên bản trước của đối tượng trong vòng lặp foreach
- 26. S3 và thứ tự của các lớp
- 27. Việc tải nhiều gói ảnh hưởng đến hiệu suất tổng thể của một ứng dụng Symfony2?
- 28. z-index, ảnh hưởng đến hiệu suất như thế nào?
- 29. Ảnh hưởng của Stemming đến tần suất hạn?
- 30. Bí danh là gì và nó ảnh hưởng như thế nào đến hiệu suất?
Ồ, tôi không nhận ra nhưng tôi đã đăng câu trả lời này 112 * giây * sau khi câu hỏi được đăng! – Potatoswatter
@Potatoswatter_cool thành tích !!! – Pooria
Ngoài ra kích thước của nó cũng quan trọng. Vì bộ xử lý x86 (và có lẽ nhiều bộ xử lý khác) có các opcodes đặc biệt để truy cập bộ nhớ với thanh ghi chỉ mục, một mảng các đối tượng có kích thước 1, 2, 4 hoặc 8 byte sẽ được truy cập nhanh hơn. – ruslik