2015-10-06 11 views
5

Hiện nay, chức năng phân bổ trong thư viện chuẩn mất std::nothrow_t bằng cách tham chiếu const như:Tại sao chức năng phân bổ nhận std :: nothrow_t theo tham chiếu chứ không phải theo giá trị?

void* operator new (std::size_t count, const std::nothrow_t& tag); 
void* operator new[](std::size_t count, const std::nothrow_t& tag); 

Kể từ std::nothrow_t chỉ đơn giản là một loại thẻ cho các mục đích cử, phải không đơn giản và (có thể) hiệu quả hơn để lấy nó bằng cách giá trị? Ví dụ:

void* operator new (std::size_t count, std::nothrow_t tag); 
void* operator new[](std::size_t count, std::nothrow_t tag); 

Lý do cơ bản đằng sau thiết kế tham chiếu const là gì?

+1

Có lẽ không có nhà xây dựng bản sao nào được gọi. – CoffeeandCode

+1

@CoffeeandCode Tôi nghĩ việc sao chép các loại thẻ là tầm thường và nhanh chóng, và tùy thuộc vào tối ưu hóa trình biên dịch. – Lingxi

+0

Nhưng việc triển khai của họ thường gây khó khăn cho ai đó để khởi tạo loại. – CoffeeandCode

Trả lời

5

Nếu cách sử dụng thông thường của phiên bản new này được gọi là new(nothrow_t()) T, bạn sẽ có một điểm tốt. Nhưng đó không phải là cách sử dụng thông thường, việc sử dụng thông thường là new(nothrow) T, trong đó nothrow được khai báo là extern const std::nothrow_t nothrow;. Mặc dù không có dữ liệu thực tế trong loại nothrow_t, nó vẫn chiếm ít nhất (một byte) và trong nhiều ABI có nghĩa là một (một lần nữa, ít nhất) một byte sẽ cần được đọc từ đối tượng nothrow trong để chuyển nó đến operator new. Lấy nó bằng cách tham chiếu đơn thuần chỉ cần tải địa chỉ của đối tượng. Vì vậy, không, nếu sự khác biệt về hiệu suất có thể đo lường được chút nào, tôi không mong đợi phiên bản giá trị sẽ nhanh hơn ở đây.

+0

Bạn có ví dụ về ABI như vậy không? Có vẻ kỳ quái với tôi để đọc từ ví dụ: một cấu trúc rỗng S để sao chép nó, chỉ vì sizeof (S) == 1. Tất cả càng nhiều nếu tối ưu hóa được bật. –

+0

@ArneVogel Không chỉ vì 'sizeof (S) == 1', nhưng nếu' S' có thể sao chép được, có nghĩa là việc sao chép có thể được thực hiện bằng 'memcpy', và ABI có thể dễ dàng chỉ định sao chép * phải * được thực hiện bằng cách tương đương với 'memcpy'. Đối với một thực hiện thực sự, trong khi tôi không biết nếu ABI của nó thực sự ủy nhiệm này, MSVC thực sự đọc từ một cấu trúc rỗng nếu đi qua giá trị, ngay cả khi tối ưu hóa được kích hoạt. – hvd

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