SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
Ý nghĩa của toán tử new
ở đây là gì?Có nghĩa là gì (3) mới?
Ý nghĩa của số 3
sau toán tử new
là gì?
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
Ý nghĩa của toán tử new
ở đây là gì?Có nghĩa là gì (3) mới?
Ý nghĩa của số 3
sau toán tử new
là gì?
Mã này đến từ LLVM's codebase. Có một tùy chỉnh operator new
in scope và nó đang được sử dụng để placement-new khởi tạo các đối tượng
void *User::operator new(size_t Size, unsigned Us) {
return allocateFixedOperandUser(Size, Us, 0);
}
Dưới đây là một ví dụ đồ chơi (cfr placement syntax.):
class SelectInst
{
public:
int x;
};
void *operator new(size_t Size, unsigned Us) {
^^^^^^^^^^^ 3 is passed here
^^^^^^^^^^^ allocation size requested
return ... // Allocates enough space for Size and for Us uses
}
SelectInst *Create() {
return new(3) SelectInst();
}
int main()
{
auto ptr = Create();
return 0;
}
Cụ thể mã đang được sử dụng để điều chỉnh không gian được phân bổ để phù hợp với dữ liệu bổ sung.
Trên doc, nó cho biết đây là lượng bộ nhớ để yêu cầu tính bằng byte. (Nếu nó không bị quá tải) Đây là yêu cầu 3 * 8 = 24 bit để lưu trữ vật cản trong bộ nhớ. Hãy nghĩ về điều này ở một số loại còn sót lại của malloc.
Giả sử SelectInst
cung cấp một số người dùng được xác định placement operator new, có một đối số do người dùng xác định int
; cú pháp gọi có nghĩa là sử dụng vị trí do người dùng xác định operator new
để cấp phát bộ nhớ. ví dụ.
class SelectInst {
public:
static void* operator new (std::size_t count, int args) {
// ~~~~~~~~
...
}
};
SelectInst *Sel = new(3) SelectInst(C, S1, S2, NameStr, InsertBefore);
// ~~~
Bạn có thể có hành tùy chỉnh mới trong SelectInst
hoặc ở phạm vi toàn cầu (tương tự như vị trí mới):
struct SelectInst
{
SelectInst(/*...*/);
// ...
static void* operator new(std::size_t sz, int custom);
static void operator delete(void* ptr, int custom); // new counter part
};
hoặc
void* operator new(std::size_t sz, int custom);
void operator delete(void* ptr, int custom); // new counter part
Xem phần cuối cùng của operator_new
'SelectInst' có thể bị quá tải cho int mới (tương tự như vị trí mới). Xem ghi chú cuối cùng của [operator_new] (http://en.cppreference.com/w/cpp/memory/new/operator_new). – Jarod42
@ Jarod42 Bạn nói đúng. Cảm ơn rất nhiều, xin lỗi vì sự cố dễ dàng. –
Kiểm tra câu trả lời này. http://stackoverflow.com/questions/40144788/how-does-the-call-new-invoke-user-defined-placement-allocation-function/40148610#40148610 – gjha