Откуда берется «размер»? - PullRequest
       4

Откуда берется «размер»?

6 голосов
/ 24 августа 2011

Я знаю, что должен быть оператор удаления, который меня не касается. Мне просто интересно, вау, это сработало. Откуда берется аргумент "размер"?

#include<iostream>
#include<string>

class Base {
public:
    Base() { }
    void *operator new( unsigned int size, std::string str ) {
    std::cout << "Logging an allocation of ";
    std::cout << size;
    std::cout << " bytes for new object '";
    std::cout << str;
    std::cout << "'";
    std::cout << std::endl;
    return malloc( size );
    }
private:
    int var1;
    double var2;
};

int main(int argc, char** argv){
    Base* b = new ("Base instance 1") Base;
}

Вот результат:

Регистрация выделения 16 байтов для нового объекта «Базовый экземпляр 1»

Ответы [ 2 ]

12 голосов
/ 24 августа 2011

Предоставляется компилятором во время компиляции.Когда компилятор видит:

new ("Base instance 1") Base;

, он добавляет вызов к:

Base::operator new(sizeof(Base), "Base instance 1");

EDIT: Компилятор, конечно, также добавляет вызов к Base::Base()

0 голосов
/ 24 августа 2011

в 32-битной арке int составляет 4 байта, double - 8, но double будет выровнен по границе 8 байтов, поэтому size = 4 + 4 (пустое пространство) + 8 = 16

...