2013-05-13 28 views
8

Tôi đang cấp phát bộ nhớ mà sau này sẽ được sử dụng để tạo đối tượng có vị trí new. Tôi có nên sử dụng operator new(n) hay tôi nên sử dụng new unsigned char[n]? Tại sao?toán tử mới (n) so với char chưa ký mới [n] cho vị trí mới

+1

Tôi nghĩ có thể làm tốt. –

+0

@sftrabbit: Vì vậy, không có sự khác biệt, về sự liên kết, ngữ nghĩa, hiệu suất, hoặc một cái gì đó như thế? – Mehrdad

+0

@Mehrdad * "ngữ nghĩa" * - Chính xác là có sự khác biệt. –

Trả lời

7

yếu tố:

  • new[] phải phù hợp với delete[]/new() với delete
  • Họ giao thứ khác nhau. operator new(n) là yêu cầu về bộ nhớ cho các mục đích không xác định, trong khi new unsigned char[n] ngụ ý ý định lưu trữ các ký tự ở đó.

Hình thức mảng có thể hơi tồi tệ hơn hiệu suất/hiệu quả khôn ngoan - chi tiết chính xác tùy thuộc vào thực hiện của bạn:

5.3.4/12 mới T [5] kết quả trong một cuộc gọi của nhà điều hành mới trong đó x là giá trị không xác định không phân tích đại diện cho chi phí phân bổ mảng: kết quả của biểu thức mới sẽ được bù đắp bằng số tiền này từ giá trị được trả về bởi operator new[] ....

BTW - không được khởi tạo:

  • operator new() trả về một void* vào bộ nhớ uninitialised: xem 3.7.4.1/2 "Không có hạn chế về nội dung của các lưu trữ phân bổ trên trở về từ chức năng phân bổ", trong khi 5.3.4/15 cho biết "mới -expression tạo ra một đối tượng kiểu T khởi tạo đối tượng đó như sau: nếu new-initializer được ommitted, đối tượng là default-initialized (8.5) "; 8.5/6 chỉ nói các kiểu lớp mặc định của các hàm tạo cung cấp khởi tạo.
5

Giá trị cũ trả về con trỏ tới một số vùng lưu trữ. Cái sau trả về một con trỏ tới phần tử đầu tiên của một mảng với một số đối tượng trong đó. Nếu bạn cần lưu trữ, hãy sử dụng bộ nhớ lưu trữ và không phải đối tượng.

+0

Sự khác nhau là gì? Cả hai đều không được khởi tạo? Hay bạn chỉ nói đó là vấn đề dễ đọc? – Mehrdad

+1

@Elazar No. Không có đối tượng nào được khởi tạo với 'toán tử new [n]'. 'new unsigned char [n]' default-initializes một mảng 'unsigned char' (và khởi tạo mặc định' unsigned char' không thực hiện khởi tạo). –

+0

@Elazar: không được khởi tạo - Tham chiếu chuẩn được cung cấp trong câu trả lời của tôi. –