Làm thế nào để ngăn chặn việc khởi tạo và hủy kiểu tự động? Trong khi nó là tuyệt vời mà T buffer[100]
tự động khởi tạo tất cả các yếu tố của buffer
, và phá hủy chúng khi chúng rơi ra khỏi phạm vi, đây không phải là hành vi tôi muốn.C++ Suppress Automatic Initialization and Destruction
#include <iostream>
static int created = 0,
destroyed = 0;
struct S
{
S()
{
++created;
}
~S()
{
++destroyed;
}
};
template <typename T, size_t KCount>
class fixed_vector
{
private:
T m_buffer[KCount];
public:
fixed_vector()
{
// some way to suppress the automatic initialization of m_buffer
}
~fixed_vector()
{
// some way to suppress the automatic destruction of m_buffer
}
};
int main()
{
{
fixed_vector<S, 100> arr;
}
std::cout << "Created:\t" << created << std::endl;
std::cout << "Destroyed:\t" << destroyed << std::endl;
return 0;
}
Kết quả của chương trình này là:
Created: 100
Destroyed: 100
Tôi muốn nó là:
Created: 0
Destroyed: 0
ý tưởng duy nhất của tôi là làm cho m_buffer
một số trivially xây dựng và destructed loại như char
và sau đó dựa vào operator[]
để bọc toán con trỏ cho tôi, mặc dù điều này có vẻ giống như một giải pháp bị tấn công khủng khiếp. Một giải pháp khác là sử dụng malloc
và free
, nhưng điều đó mang lại một mức độ vô hướng mà tôi không muốn.
Lý do tôi muốn điều này là vì tôi đang tạo thùng chứa và tôi không muốn trả tiền cho phí khởi tạo của những thứ mà tôi sẽ không sử dụng. Ví dụ, nếu chức năng main
của tôi là:
int main()
{
{
std::vector<S> vec;
vec.reserve(50);
}
std::cout << "Created:\t" << created << std::endl;
std::cout << "Destroyed:\t" << destroyed << std::endl;
return 0;
}
Kết quả sẽ chính xác:
Created: 0
Destroyed: 0
Tại sao bạn muốn một mảng các phiên bản 'S' không bị cấu trúc? Bạn có thể sử dụng chúng để làm gì? –
Không có gì - đó là vấn đề. Tôi đã sửa đổi câu hỏi của mình bằng cách biện minh. –
Vì vậy, nếu tôi hiểu bạn một cách chính xác, bạn muốn dự trữ không gian trong vectơ của mình cho các phần tử bạn sẽ điền vào sau và bạn không muốn trả tiền cho việc xây dựng (và hủy) các phần tử hai lần. Sự khác biệt về hiệu suất này có thực sự quan trọng không? Bạn đã lược tả ứng dụng của mình và xác minh rằng đây là nơi được dành nhiều thời gian nhất trong khi thực hiện? –