Lời mở đầu cho người tối ưu hóa vi mô
Nhớ lại:
"Các lập trình viên lãng phí rất nhiều thời gian để suy nghĩ hoặc lo lắng về tốc độ của các phần không văn bản trong chương trình của họ và những nỗ lực này có hiệu quả thực sự có tác động tiêu cực mạnh khi gỡ lỗi và bảo trì. Chúng ta nên quên đi những hiệu quả nhỏ, nói về 97% thời gian: tối ưu hóa sớm là gốc rễ của mọi tội lỗi. Tuy nhiên, chúng ta không nên bỏ qua cơ hội của mình trong 3% quan trọng đó ".
(Nhờ vào biến thái cho trích dẫn đầy đủ)
Đừng sử dụng mảng C thay vì vectơ (hoặc bất cứ thứ gì) chỉ vì bạn tin rằng nó nhanh hơn vì nó được coi là cấp thấp hơn. Bạn sẽ sai.
Sử dụng theo vectơ mặc định (hoặc thùng chứa an toàn phù hợp với nhu cầu của bạn), và sau đó nếu trình hồ sơ của bạn nói rằng đó là một vấn đề, hãy xem liệu bạn có thể tối ưu hóa nó hay không, bằng cách sử dụng thuật toán tốt hơn hoặc thay đổi vùng chứa.
Điều này nói rằng, chúng ta có thể quay trở lại câu hỏi ban đầu.
Mảng tĩnh / động?
Các lớp mảng C ++ hoạt động tốt hơn mảng C cấp thấp vì họ biết rất nhiều về bản thân và có thể trả lời các câu hỏi C mảng không thể. Họ có thể tự làm sạch. Và quan trọng hơn, chúng thường được viết bằng cách sử dụng các mẫu và / hoặc nội tuyến, điều đó có nghĩa là những gì xuất hiện rất nhiều mã trong gỡ lỗi sẽ giải quyết ít hoặc không có mã được tạo trong bản phát hành, nghĩa là không có sự khác biệt với cạnh tranh kém an toàn tích hợp của chúng.
Nói chung, nó thuộc hai loại:
Mảng động
Sử dụng một con trỏ tới mảng malloc-ed / new-ed sẽ nhanh nhất bằng phiên bản std :: vector và ít an toàn hơn (xem bài đăng của litb ).
Vì vậy, sử dụng một std :: vector.
Mảng tĩnh
Sử dụng một mảng tĩnh sẽ là tốt nhất:
Vì vậy, sử dụng một mảng std :: .
Bộ nhớ chưa được khởi tạo
Đôi khi, sử dụng vector
thay vì bộ đệm thô sẽ phát sinh chi phí có thể nhìn thấy vì vector
sẽ khởi tạo bộ đệm khi xây dựng, trong khi mã mà nó thay thế thì không, như bernie đã nhận xét trong câu trả lời của mình .
Nếu đây là trường hợp, thì bạn có thể xử lý nó bằng cách sử dụng unique_ptr
thay vì vector
hoặc, nếu trường hợp đó không phải là ngoại lệ trong dòng mã của bạn, hãy thực sự viết một lớp buffer_owner
sẽ sở hữu bộ nhớ đó và cho phép bạn truy cập dễ dàng và an toàn vào nó, bao gồm tiền thưởng như thay đổi kích thước nó (sử dụng realloc
?), hoặc bất cứ thứ gì bạn cần.