Форум программистов, компьютерный форум CyberForum.ru

Malloc vs new - C++

Восстановить пароль Регистрация
Другие темы раздела
C++/CLI WinForms Игнорировать нажатие Enter в TextBox http://www.cyberforum.ru/cpp-beginners/thread1495397.html
Подскажите как игнорировать нажатие enter в форме textbox?
C++ Реализовать собственный cin Я короче хочу реализовать собственный cin. Просто оно медленно работает. И в этом проблема. typedef long long ll; struct Cin{ void operator >>(ll &x){ scanf("%lld", &x); } }Cin; http://www.cyberforum.ru/cpp-beginners/thread1495377.html
Вывести те согласные буквы, которые входят в первое предложение и не входят во второе C++
Всем привет помогите пожалуйста-Решить задачу с использованием множества: имеются два предложения, состоящие из русских букв, цифр и знаков препинания. Вывести те согласные буквы, которые входят в первое предложение и не входят во второе.
Квадратное уравнение (найти ошибку) C++
Добрый день, решал вот такую задачку, однако она не проходит один из тестов, помогите найти ошибку. Также, как я понял, при отсутствии корней нужно вывести просто 0 - как-то умалчивается об этом в условии. Спасибо. Сложно найти человека, который любит решать однообразные задачки по математике. В последнее время школьникам стало легче, ведь с появлением компьютеров почти в каждой квартире стало...
C++ Обработка нажатия клавиши http://www.cyberforum.ru/cpp-beginners/thread1495324.html
нужно задать нажатию клавиши enter другие функции: private: System::Void textBox1_TextChanged_1(System::Object^ sender, System::EventArgs^ e) { if (Control::ModifierKeys == Keys::Enter) { //код этих новых действий } а у меня не работает. В чем ошибка?
C++ Шаблоны В файле есть такое определение template<int32 aMaxLength> class TTextBuffer: public MString { public: /** Construct an empty TTextBuffer object. */ TTextBuffer() { } /** Construct a TTextBuffer object from an 8-bit ASCII string. */ TTextBuffer(const char* aText) подробнее

Показать сообщение отдельно
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
08.07.2015, 17:08     Malloc vs new
Цитата Сообщение от VoltDeMar Посмотреть сообщение
Хочется узнать как это реализуется в реальности.
Как показал, так и реализуется.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
Что я должен понять из этого кода?
То, что любой блок памяти можно представить как любой объект и работать с ним так, как будто бы он там есть.
С этой точки зрения все равно есть ли в объекте конкретные значения или там мусор лежит. Главное, что есть память.

Цитата Сообщение от VoltDeMar Посмотреть сообщение
Как происходит поэтапно доступ к членам класса?
Выше показал. Вот есть класс А:
C++
1
2
3
4
5
6
class A {
public:
    int v;
    
    A() : v(10) {}
};
Добавим ему функцию foo:
C++
1
2
3
4
5
6
7
8
9
10
class A {
public:
    int v;
 
    A() : v(10) {}
 
    void foo() {
         printf("value: %d\n", v);
    }
};
Что в реальности будет сделано? Компилятором будет создана такая функция:
C++
1
2
3
    void foo(A * this) {
         printf("value: %d\n", this->v);
    }
Теперь создадим объект через new. Выражение new включает выделенеи памяти и инициализацию объекта. Выделение памяти делается посредством operator new (который можно перегружать), будет выделена память sizeof(A). А он, в свою очередь, может быть реализован как обычный malloc. Итого:
C++
1
A * p = (A*)malloc(sizeof(A));
Теперь проводим инициализацию (вызываем конструктор):
C++
1
::new(p) A(); // здесь v задается значение 10
Здесь будет вызван конструктор для памяти, которую выделил malloc.
Затем сделаем вызов функции foo, который по сути является вот чем:
C++
1
foo(p); // p->foo();
Тут все понятно?
Теперь выкинем вызов конструктора из этой цепочки. Что изменилось? У v значение не 10, а какое-то случайное, которые было в памяти до ее использования в аллокации. И printf в foo выведет это число. Больше ничего не поменялось.

Никакие структуры данных, отвечающие на строение классов в рантайме не сохраняются (статически типизированный, компилируемый язык). Есть только память, регистры и смещения в памяти, которые генерирует компилятор, строя машинный код. Если мы в коде написали, что, вот этот блок памяти - имеет тип A, то и код будет генерироваться таким образом, чтобы отвечать принятым для А (размеры данных, смещения полей от начала блока, отступы для выравнивания и т.д.) соглашениям (это называется ABI).
 
Текущее время: 22:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru