câu hỏi cụ thể của tôi là khi thực hiện một singleton class trong C++, là có bất kỳ sự khác biệt đáng kể giữa hai bên dưới mã liên quan đến hiệu suất, vấn đề bên hoặc một cái gì đó:Heap/năng động so với cấp phát bộ nhớ tĩnh ví dụ C++ singleton lớp
class singleton
{
// ...
static singleton& getInstance()
{
// allocating on heap
static singleton* pInstance = new singleton();
return *pInstance;
}
// ...
};
và điều này:
class singleton
{
// ...
static singleton& getInstance()
{
// using static variable
static singleton instance;
return instance;
}
// ...
};
(Lưu ý rằng dereferencing trong việc thực hiện đống dựa trên không ảnh hưởng đến hiệu suất, như AFAIK không có máy mã phụ tạo cho dereferencing. Nó dường như chỉ là vấn đề cú pháp để phân biệt với con trỏ)
UPDATE:.
Tôi đã có câu trả lời thú vị và ý kiến mà tôi cố gắng tóm tắt chúng ở đây. (Đọc câu trả lời chi tiết được khuyến khích cho những người quan tâm.):
- Trong singleton sử dụng tĩnh biến địa phương, các destructor lớp được tự động gọi tại thời điểm thôi quá trình, trong khi đó trong việc phân bổ trường hợp động , bạn có để quản lý sự phá hủy đối tượng một cách nào đó vào lúc nào đó, ví dụ bằng cách sử dụng con trỏ thông minh:
static singleton& getInstance() {
static std::auto_ptr<singleton> instance (new singleton());
return *instance.get();
}
Các singleton sử dụng phân bổ động "lazier" hơn biến singleton tĩnh, như trong trường hợp sau, bộ nhớ cần thiết cho các đối tượng singleton là (luôn luôn ?) được đặt trước khi khởi động quá trình (như một phần của toàn bộ bộ nhớ cần thiết cho chương trình tải) và chỉ gọi của nhà xây dựng singleton được hoãn lại là
getInstance()
thời gian gọi. Điều này có thể quan trọng khisizeof(singleton)
lớn.Cả hai đều an toàn chỉ trong C++ 11. Nhưng với các phiên bản trước của C++, nó thực hiện cụ thể.
Trường hợp phân bổ động sử dụng một mức không giới hạn để truy cập đối tượng đơn lẻ, trong trường hợp đối tượng đơn lẻ tĩnh, địa chỉ trực tiếp của đối tượng được xác định và mã hóa cứng tại thời gian biên dịch.
P.S .: Tôi đã sửa chữa các thuật ngữ tôi đã sử dụng trong bài đăng ban đầu theo câu trả lời của @ TonyD của.
Bạn đã so sánh lắp ráp được tạo cho cả hai? –
No. Nếu bạn có nghĩa là tạo ra lắp ráp cho hai triển khai khác nhau, họ rõ ràng là khác nhau, như một trong những phân bổ trên heap và một trong những hiện một thời gian tải/gọi khởi tạo. Nếu bạn có nghĩa là tạo ra lắp ráp cho dereferencing, không, tôi đã không so sánh. Tôi đoán vậy. –