- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Tôi có một loại có yêu cầu căn chỉnh nghiêm ngặt (do sử dụng các hoạt động AVX) lớn hơn căn chỉnh mặc định của nền tảng.
Để đơn giản hóa việc sử dụng lớp này tôi muốn chuyên std::make_shared
Luôn sử dụng bộ cấp phát thích hợp cho loại.
Như thế này:
không gian tên std{
mẫu nội tuyến
auto make_shared(Args&&... args){
return std::allocate_shared(allocator_type, std::forward(args)...);
}
}
Câu hỏi của tôi là, tiêu chuẩn có cho phép điều này không? Nó sẽ hoạt động như mong đợi?
câu trả lời hay nhất
Từ N4140 [namespace.std]/1 (tôi nhấn mạnh):
Hành vi của chương trình C++ không được xác định nếu nó thêm các khai báo hoặc định nghĩa vào không gian tên std hoặc vào một không gian tên trong không gian tên std trừ khi có quy định khác. Một chương trình có thể thêm chuyên môn mẫu cho bất kỳ mẫu thư viện tiêu chuẩn nào vào không gian tên std chỉ nếu việc khai báo phụ thuộc vào loại do người dùng xác định và chuyên môn đáp ứng các yêu cầu thư viện tiêu chuẩn cho mẫu gốc và không bị cấm rõ ràng.
Vì bạn đang thêm chuyên môn về mẫu dựa trên loại do người dùng xác định, nên đây là tiêu chuẩn
Mở rộng không gian tên hiệu quả.
Tuy nhiên, như @dyp đã chỉ ra, bạn không thể chuyên môn hóa một phần các mẫu chức năng. Tùy chọn tốt nhất của bạn là chỉ định rõ ràng X
tham số cho hàm tạo (mất chuyển tiếp hoàn hảo) hoặc chỉ viết một make_shared_x
chức năng (mất tính nhất quán).
Về c++ - chuyên std::make_shared, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/31473756/
Tôi đã tạo một ví dụ về máy chủ echo trong boost::asio. Nhưng việc sử dụng boost::make_shard sẽ gây ra "ngoại lệ không xác định", trong khi std::make_shared thì không. Xem dòng bình luận.
Tôi đang thực hiện một số thử nghiệm hiệu suất trực tiếp 1>std::shared_ptr, std::make_shared dựa trên 'gcc 4.7.2' & 'Triển khai VC10' 2>boo
Câu hỏi 1> Tốc độ sử dụng của Tuyến 1 có thực sự tốt hơn Tuyến 2 không? boost::shared_ptr shpStr = boost::make_shared(); // Dòng 1 boost::sh
Như đã nêu trong "Hành trình đến C++" của Bjarne Stroustrup, một thực tiễn C++14 đã biết là người ta nên tránh sử dụng mã mới và xóa trong mã. Thư viện chuẩn cung cấp std::make_shar
Đây có thể là một bản sao nhưng tôi không thể tìm thấy giải pháp ở bất cứ đâu. Tôi có mã nguồn như thế này: struct Blob{ //... static void *operator new(size_t si
Tôi có một lớp với hàm tạo mẫu và muốn có một con trỏ chia sẻ cho nó. Ví dụ: lớp A; typedef std::shared_ptr A_ptr; lớp A { công khai:
Sử dụng VS 2015 với v120. Vì vậy, tôi nhận được một ngoại lệ bộ nhớ vì khi tôi gọi make_shared() trên một đối tượng đã được xây dựng. Đối tượng được xây dựng có một con trỏ tới một đối tượng khác được cấp phát mới, vì vậy
Trong câu trả lời này, trạng thái TC boost::make_shared, v.v. hỗ trợ các loại mảng - một trong những kích thước không xác định hoặc một trong fi
Mặc dù tôi có sẵn std::tr1::shared_ptr trong trình biên dịch của mình nhưng tôi không có make_shared. Có ai có thể cho tôi biết cách triển khai make_shared chính xác không? Tôi hiểu rằng tôi cần sử dụng các đối số biến thiên để cung cấp hàm tạo của T
Tôi đang cố gắng tự mình triển khai Shared_ptr. Đã xảy ra sự cố với make_shared. Tính năng chính của std::make_shared là nó phân bổ các khối bộ đếm và các đối tượng trong các khối bộ nhớ liền kề. Làm thế nào tôi có thể làm điều tương tự?
Trừ khi B0RKEN được xác định (như -DB0RKEN trên dòng lệnh), hãy biên dịch phần sau: #include #include #include bằng cách sử dụng boost::shared_ptr;
Có cách nào để sử dụng make_shared thay vì Shared_ptr làm kiểu trừu tượng không? Ví dụ: #include #include class Foo { public: virtual
đóng cửa. Câu hỏi này yêu cầu chi tiết gỡ lỗi. Hiện tại nó không chấp nhận câu trả lời. Chỉnh sửa câu hỏi để bao gồm hành vi mong muốn, một vấn đề hoặc lỗi cụ thể và
Tôi hiểu: Shared_ptr x = make_shared(); hiệu quả hơn: Shared_ptr x(new X()); Tuy nhiên, tôi không hiểu tại sao trình biên dịch không thể có quy tắc như vậy "tôi
Với gcc 4.6.2, make_shared() cung cấp một truy nguyên vô dụng nếu hàm tạo đưa ra một ngoại lệ (rõ ràng là do một số lần thử lại). Tôi đang sử dụng make_shared() để lưu một số thao tác nhập nhưng đây chỉ là công cụ chặn hiển thị. tôi tạo ra
Bắt đầu từ C++11, các nhà phát triển có xu hướng sử dụng các lớp con trỏ thông minh cho các đối tượng vòng đời động vì một số lý do. Đối với các lớp, tiêu chuẩn con trỏ thông minh mới đó, thậm chí không nên sử dụng các toán tử như mới mà nên sử dụng make_shared hoặc m
Về mặt lý thuyết, một điểm khác biệt giữa make_shared() và Shared_ptr là kỹ thuật cấp phát bộ nhớ. make_shared() nên sử dụng một khối và Shared_ptr nên sử dụng hai khối
Để tránh hạn chế đối với các đối số mẫu rõ ràng được cung cấp một phần, tôi sẽ rút ra cách nhúng cấu trúc của các tham số mẫu lớp (Nội bộ) từ
Tại sao make_shared phân bổ cùng một địa chỉ bộ nhớ trong hai cuộc gọi riêng biệt? typedef struct { int a; int c } test_t;
Tôi hiện đang xử lý các vấn đề về Shared_ptr. Tôi tò mò nếu make_shared không thành công, liệu nó có tạo ra ngoại lệ không? Có trường hợp nào make_shared trả về nullptr mà không có bất kỳ ngoại lệ nào không? Câu trả lời hay nhất đã đến
Tôi là một lập trình viên xuất sắc, rất giỏi!