2017-05-03 32 views
17
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ì?

+1

'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

+1

@ Jarod42 Bạn nói đúng. Cảm ơn rất nhiều, xin lỗi vì sự cố dễ dàng. –

+0

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

Trả lời

12

Mã này đến từ LLVM's codebase. Có một tùy chỉnh operator newin 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; 
} 

Live Example

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.

-1

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.

7

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); 
//     ~~~ 
4

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