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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
alexsanqp
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 37
#1

Растолкуйте new с адресацией! - C++

30.01.2014, 16:30. Просмотров 802. Ответов 20
Метки нет (Все метки)

Я так понимаю что это для избегания повторного выделения памяти? но до конца так и не понял. Спасибо откликнувшимся.
Вот я экспериментировал:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
using namespace std;
 
char buffer[500];
 
void main()
{
        int *a, *b, *c;
 
        a = new (buffer) int[120];
        b = new (buffer) int[200];
        с = new int[8];
 
    a[2] = 220;
    b[3] = 330;
    c[4] = 440;
 
    cout << a[2] << "   " << &a[2] << endl;
    cout << b[3] << "   " << &b[3] << endl;
        cout << c[4] << "   " << &c[4] << endl;
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6192 / 5795 / 1877
Регистрация: 18.12.2011
Сообщений: 14,804
Завершенные тесты: 1
30.01.2014, 17:32     Растолкуйте new с адресацией! #2
Первый раз такое встречаю,
но при трассировке увидел, что
массивы a,b и buffer начинаются с одного и того же места.
Получается, что в такой конструкции
C++
1
a=new(buffer) int[120];
buffer - это адрес, начиная с которого надо выделить память.
Croessmah
Модератор
Эксперт CЭксперт С++
12727 / 7187 / 802
Регистрация: 27.09.2012
Сообщений: 17,727
Записей в блоге: 2
Завершенные тесты: 1
30.01.2014, 18:03     Растолкуйте new с адресацией! #3
placement new размещает объект в указанном куске памяти
Цитата Сообщение от alexsanqp Посмотреть сообщение
но до конца так и не понял.
что остается не понятным?
alexsanqp
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 37
30.01.2014, 19:05  [ТС]     Растолкуйте new с адресацией! #4
Цитата Сообщение от Croessmah Посмотреть сообщение
что остается не понятным?
ну к примеру, если в указателе "а" число элементов массива превышает число "buffer". Допустим
C++
1
2
3
4
5
6
7
8
9
//...
char buffer[20];
 
void main() {
 int *a;
 
 a = new (buffer) int[50];
 
}
Все выводится без ошибок. И правильно ли считается, к примеру что бы 3 указателя ссылались на "buffer" ?
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 19:20     Растолкуйте new с адресацией! #5
Цитата Сообщение от alexsanqp Посмотреть сообщение
Все выводится без ошибок.
А ты выдели памяти побольше и запиши что-нибудь под потолок, увидишь.
buffer - это не динамическая память, к слову.
zelim
77 / 77 / 4
Регистрация: 26.12.2011
Сообщений: 217
30.01.2014, 19:24     Растолкуйте new с адресацией! #6
alexsanqp, buffer указывает на участок памяти и не несет никакой информации о том, сколько там памяти было выделено ранее. То есть, всё так и должно отработать без ошибок.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
30.01.2014, 19:32     Растолкуйте new с адресацией! #7
Цитата Сообщение от alexsanqp Посмотреть сообщение
правильно ли считается, к примеру что бы 3 указателя ссылались на "buffer" ?
не правильно, массив a и b разделяют одну область памяти, начало массива b на сдвинуть на размер массива a (еще надо учитывать выравнивание) - то есть
C++
1
b = new (buffer + 120) int[200];
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 19:35     Растолкуйте new с адресацией! #8
Цитата Сообщение от zelim Посмотреть сообщение
alexsanqp, buffer указывает на участок памяти и не несет никакой информации о том, сколько там памяти было выделено ранее. То есть, всё так и должно отработать без ошибок.
Даже, если бы нес, ошибок бы не было.

Добавлено через 2 минуты
Цитата Сообщение от Кудаив Посмотреть сообщение
не правильно, массив a и b разделяют одну область памяти, начало массива b на сдвинуть на размер массива a (еще надо учитывать выравнивание) - то есть
Код C++
1
b = new (buffer + 120) int[200];
И бага никуда не денется.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
30.01.2014, 19:43     Растолкуйте new с адресацией! #9
Цитата Сообщение от alexsanqp Посмотреть сообщение
Все выводится без ошибок
так как память при применении placement new выделяется функцией имеющую такую простую реализацию
C++
1
2
3
4
void* operator new(size_t size, void* ptr)
{
     return ptr; // память для размещения уже есть выделять ничего не нужно
}
Цитата Сообщение от alexsanqp Посмотреть сообщение
ну к примеру, если в указателе "а" число элементов
массива превышает число "buffer"
то будет непонятно что, что называется undefined behavior - мы можем писать в память принадлежащую буферу - в рантайме при записи вне буфера практически гарантированно сигаборт

Добавлено через 45 секунд
Vourhey, о какой баге речь?
Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
30.01.2014, 19:44     Растолкуйте new с адресацией! #10
Placement new предназначен для создания объекта с помощью конструктора, даже если память под объект уже выделена. Вся суть в вызове конструктора! Создавать инты с помощью placement new бессмысленно!
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 19:52     Растолкуйте new с адресацией! #11
Цитата Сообщение от Кудаив Посмотреть сообщение
Добавлено через 45 секунд
Vourhey, о какой баге речь?
Об этой
Цитата Сообщение от Кудаив Посмотреть сообщение
в рантайме при записи вне буфера практически гарантированно сигаборт
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,165
Завершенные тесты: 2
30.01.2014, 19:55     Растолкуйте new с адресацией! #12
Vourhey, так это не бага - это особенности работы C++ с памятью, не использовать использовать с осторожностью
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,397
30.01.2014, 20:04     Растолкуйте new с адресацией! #13
Сообщение было отмечено автором темы, экспертом или модератором как ответ

Не по теме:

я бы так сказал под одним словом new скрывается много сущностный
одну из них объяснил Croessmah,
еще много будет таких вопросов, чем больше будешь погружаться в эту рутину под названием С с плюсами
а равно и без них
может я скажу глупость(тоном менотора) рассуждать о плюсах и минусах этого языка
может тот кто научился думать на уровне процессора.
Не зря его называют "высокоуровневый ассемблер"
всеми тонкостями могут пользоваться только тот кто прошел весь путь, и это не дискриминация
ребенку не дают в руки опасную бритву
так же и Си грамотное владение им позволяет сделать эффективные программы, не грамотное приведет к краху, и ладно бы сейчасможет через много лет, поменялся процессор, система......
Еще раз повторю "высокоуровневый ассемблер" нужно мыслить как процессор
это в отличии от Виртовского паскаля хоть и K&R заявляли что это кросплатформенный язык
этого не произошло под каждую платформу есть свой диалект языка
посему не удивляйся а учи язык



Добавлено через 5 минут
Цитата Сообщение от alexsanqp Посмотреть сообщение
ну к примеру, если в указателе "а" число элементов массива превышает число "buffer".
И что адрес не изменился
к примеру
есть указатель он указывает на улицу Крауля д.1( извините за местечковость) и один массив говорит пойди до дома 3
другой до дома 5
а третий вообще до дома 1000, и наплевать, что дома такого нет
в любом случае оператор говорит отсчитывай от дома номер 1
alexsanqp
2 / 2 / 0
Регистрация: 06.03.2013
Сообщений: 37
30.01.2014, 20:25  [ТС]     Растолкуйте new с адресацией! #14
Спасибо всем, за ясные ответы.
Vourhey
Почетный модератор
6473 / 2248 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 21:45     Растолкуйте new с адресацией! #15
Цитата Сообщение от Кудаив Посмотреть сообщение
так это не бага - это особенности работы C++ с памятью
Это именно бага - сдвигать указатель на невыделенную область памяти и осуществлять там операции. Если ты считаешь, что это правильно, то проблемы у автора в коде нет вообще и сдвигать ничего не нужно.
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,397
30.01.2014, 22:03     Растолкуйте new с адресацией! #16
Цитата Сообщение от alexsanqp Посмотреть сообщение
a = new (buffer) int[120];
а мне одно интересно кто то этим в жизни пользуется?
напоминает анекдот
" В глухую сибирскую деревню прислали умную японскую машину для пилки дров
Мужики засунули в машину тоненький прутик
"Вжик" сказала машина и перепилила прутик
"У бля" сказали мужики и засунули в машину бревно
"Вжик вжик" сказала машина и перепилила бревно
"Уу бля" сказали мужики и засунули в машину стальную проволочку
"Вжжик вжжжик вжжжик" сказала машина и перепилила проволочку
"Уууу блляяя" сказали мужики и засунули в машину большую рельсу
"Вжжжжик вжжжжж" сказала машина и сломалась
"А! бля" сказали мужики и пошли пилить дрова"
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 22:49     Растолкуйте new с адресацией! #17
Цитата Сообщение от ValeryS Посмотреть сообщение
а мне одно интересно кто то этим в жизни пользуется?
Что есть в литературе.
Миниатюры
Растолкуйте new с адресацией!   Растолкуйте new с адресацией!   Растолкуйте new с адресацией!  

Kuzia domovenok
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
30.01.2014, 23:09     Растолкуйте new с адресацией! #18
ValeryS, таки пользуются. Речь же о плейсмент new?

Простой пример. У класса widget нет конструктора по-умолчанию. Только с параметром.
Создать динамический массив объектов класса widget, запросив в консоли количество объектов и параметр каждого.
ValeryS
Модератор
6485 / 4951 / 455
Регистрация: 14.02.2011
Сообщений: 16,397
30.01.2014, 23:20     Растолкуйте new с адресацией! #19
alsav22,
третья вкладка убедила
а первые две чисто теория
Kuzia domovenok,
тоже убедил
самкогдато пользовался но за ненадобностью забыл
По мне это костыли
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.01.2014, 02:27     Растолкуйте new с адресацией!
Еще ссылки по теме:

C++ На Дваче анон поднял хитрый пример на тему ++i, растолкуйте мне, гики, а то я так ничего и не понял
C++ Case в switch и вообще растолкуйте за код
Растолкуйте почему выводится единица C++
Assembler Помоготе с индексной адресацией
Растолкуйте строчку из вики о фабричном методе C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
alsav22
5413 / 4809 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
31.01.2014, 02:27     Растолкуйте new с адресацией! #20
Цитата Сообщение от ValeryS Посмотреть сообщение
третья вкладка убедила
Это не для убеждения, для информации (пишут, когда такое применяется, или может быть применено).

Добавлено через 2 часа 32 минуты
Кстати, на третьем скрине ошибка в коде есть.
C++
1
2
for (int i  = 0; i < 10; ++i)
        new(bestPieces[i]) EquipmentPiece(идентификационный номер);
Нужно или так:
C++
1
2
for (int i  = 0; i < 10; ++i)
        new(&bestPieces[i]) EquipmentPiece(идентификационный номер);
Или так:
C++
1
2
for (int i  = 0; i < 10; ++i)
        new(bestPieces + i) EquipmentPiece(идентификационный номер);
Yandex
Объявления
31.01.2014, 02:27     Растолкуйте new с адресацией!
Ответ Создать тему
Опции темы

Текущее время: 21:19. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru