2013-05-01 39 views
5

Tôi đã tìm kiếm nhưng không thể tìm thấy câu trả lời cho điều này. Có cách nào để thông báo cho nhà điều hành new về số không gọi số nhà thầu lớp học không?C++ uninitialized mảng của trường hợp lớp

MyObject* array = new MyObject[1000]; 

Điều này sẽ gọi MyObject() một nghìn lần! Tôi muốn tự điền vào bộ nhớ được cấp phát và không cần bất kỳ thông tin nào được khởi tạo trong hàm tạo. Sử dụng malloc() không phải là rất hài hòa mã C++ imho.

MyObject* array = (MyObject*) malloc(sizeof(MyObject) * 1000); 

Trả lời

4

C++ tương đương với malloc là chức năng phân bổ operator new. Bạn có thể sử dụng nó như vậy:

MyObject* array = static_cast<MyObject*>(::operator new(sizeof(MyObject) * 1000)); 

Sau đó bạn có thể xây dựng một đối tượng cụ thể với vị trí mới:

new (array + 0) MyObject(); 

Thay 0 với bất cứ bù đắp bạn muốn khởi.

Tuy nhiên, tôi tự hỏi bạn có thực sự muốn tự mình phân bổ động không. Có lẽ một std::map<int, MyObject> hoặc std::unordered_map<int, MyObject> sẽ phù hợp với bạn tốt hơn, để bạn có thể tạo một MyObject tại bất kỳ chỉ mục nào.

std::unordered_map<int, MyObject> m; 
m[100]; // Default construct MyObject with key 100 
+0

Cảm ơn câu trả lời của bạn. Bất kỳ nhược điểm nào của việc sử dụng kiểu đúc kiểu C trên 'static_cast'? Cú pháp xây dựng là mới đối với tôi. Tốc độ là chìa khóa, tôi không nghĩ rằng phù hợp với bản đồ vì tôi thực sự cần một mảng tuyến tính của một số cố định của các yếu tố. –

+0

@Niklas Trong trường hợp này, không có bất lợi nào. Dàn diễn viên kiểu C được định nghĩa là tập đầu tiên của một bộ phôi sẽ thành công. Trong trường hợp này, nó sẽ tương đương với 'static_cast'. Tuy nhiên, tôi thích được rõ ràng hơn. Ngoài ra, có rất nhiều thông tin về Stack Overflow về cú pháp mới của vị trí. –

+0

@NiklasR Chỉ cần đảm bảo: bạn có muốn tạo các đối tượng tuần tự (bắt đầu từ chỉ mục 0 trở lên) hoặc tại các vị trí tùy ý trong mảng không? Nếu bạn muốn chúng tuần tự, thì câu trả lời 'std :: vector' của slow là thích hợp. –

4

Thật vậy, việc sử dụng malloc không phải là rất hài hòa với mã C++. Nhưng malloc thực hiện chính xác những gì bạn đang yêu cầu. Vì vậy, tôi sợ những gì bạn đang yêu cầu không phải là rất hài hòa với C + + hoặc. Tôi đoán bạn chỉ cần quyết định ngôn ngữ nào bạn muốn lập trình bằng C hoặc C++.

Tôi cho rằng tùy chọn thực sự duy nhất khác của bạn là viết lại MyObject để nó không có bất kỳ hàm tạo nào, nhưng cũng không thực sự là cách C++.

3

chỉ cần sử dụng std :: vector

std::vector<MyObject> v; 

v.reserve(1000); // allocate raw memory 
v.emplace_back(42); // construct in place 

để truy cập ngẫu nhiên (đây là (cơ bản) những gì std :: vector không nội):

typedef std::aligned_storage<sizeof(MyObject), std::alignment_of<MyObject>::value>::type Storage; 
MyObject* myObjects(reinterpret_cast<MyObject*>(new Storage[1000])); 

new (myObjects + 42) MyObject(/* ? */); // placement new 
(*(myObjects + 42)).~MyObject(); 
0

Bạn đã hẹn giờ nó? Liệu nó có 'quá dài'? Điều này có xảy ra chỉ một lần trong quá trình thực hiện chương trình của bạn, như lúc bắt đầu không? Đầu tiên xác định rằng nó thực sự là một vấn đề.

Bạn có thực sự cần phân bổ 1000 đối tượng theo cách này không?

Ngoài ra, nếu các nhà thầu không được gọi, các đối tượng sẽ được ... xây dựng như thế nào?

+0

Đây không phải là câu trả lời hữu ích. Có, tôi đã xác định rằng nó thực sự * là * một vấn đề. Mọi chi phí phải được giảm, nếu có thể. –

+3

Không sao cả. Nó không được đưa ra bởi các nhà bình luận khác và bạn đã không đề cập đến điều đó trong câu hỏi của bạn, vì vậy tôi nghĩ đó là một góc liên quan. Bây giờ tôi thấy sftrabbit đã hỏi "Tôi tự hỏi liệu bạn có thực sự muốn làm phân bổ động này cho mình" mà là tương tự như bình luận thứ 2 của tôi. – codah

Các vấn đề liên quan