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

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

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

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

30.01.2014, 16:30. Просмотров 816. Ответов 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)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.01.2014, 16:30     Растолкуйте new с адресацией!
Посмотрите здесь:

New с адресацией - C++
Объясните пожалуйста, почему массив buffer не инициализируется нигде, а память все равно выделяется. Т.е. какое-то значение buffer -у...

Растолкуйте код - C++
Помогите с кодом cout &lt;&lt; (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? '#' : a) &lt;&lt; (j &lt;= M ? &quot;&quot; : &quot;\n&quot;); что делает cout &lt;&lt; ( ? : ); я...

Растолкуйте почему выводится единица - C++
Почему выводит 1?? #include int main(int argc, char** argv) { int x = 0; int y = 0; if (x++ &amp;&amp; y++) ...

растолкуйте про хэш плиз - C++
на картинке реализация поиска в &quot;hash_map&quot; от Страуструпа. И все бы хорошо если бы не один момент. b и v это векторы. И доступ по индексу...

Что такое Хэш таблица с открытой адресацией - C++
Здраствуйте у меня такой вопрос то такое Хэш таблица с открытой адресацией хеш функция что должно храниться в структуре как осуществляется...

Case в switch и вообще растолкуйте за код - C++
Объясните пожалуйста что имеет в виду Стаус 1)case'(':case')': 2) curr_tok=Token_Value(ch) это приведение к Token_Value? 3)чем по...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zss
Модератор
Эксперт С++
6282 / 5885 / 1905
Регистрация: 18.12.2011
Сообщений: 15,094
Завершенные тесты: 1
30.01.2014, 17:32     Растолкуйте new с адресацией! #2
Первый раз такое встречаю,
но при трассировке увидел, что
массивы a,b и buffer начинаются с одного и того же места.
Получается, что в такой конструкции
C++
1
a=new(buffer) int[120];
buffer - это адрес, начиная с которого надо выделить память.
Croessmah
Модератор
Эксперт CЭксперт С++
12979 / 7291 / 812
Регистрация: 27.09.2012
Сообщений: 18,007
Записей в блоге: 3
Завершенные тесты: 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
Почетный модератор
6474 / 2249 / 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
Почетный модератор
6474 / 2249 / 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
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
30.01.2014, 19:44     Растолкуйте new с адресацией! #10
Placement new предназначен для создания объекта с помощью конструктора, даже если память под объект уже выделена. Вся суть в вызове конструктора! Создавать инты с помощью placement new бессмысленно!
Vourhey
Почетный модератор
6474 / 2249 / 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
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
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
Почетный модератор
6474 / 2249 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
30.01.2014, 21:45     Растолкуйте new с адресацией! #15
Цитата Сообщение от Кудаив Посмотреть сообщение
так это не бага - это особенности работы C++ с памятью
Это именно бага - сдвигать указатель на невыделенную область памяти и осуществлять там операции. Если ты считаешь, что это правильно, то проблемы у автора в коде нет вообще и сдвигать ничего не нужно.
ValeryS
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
30.01.2014, 22:03     Растолкуйте new с адресацией! #16
Цитата Сообщение от alexsanqp Посмотреть сообщение
a = new (buffer) int[120];
а мне одно интересно кто то этим в жизни пользуется?
напоминает анекдот
" В глухую сибирскую деревню прислали умную японскую машину для пилки дров
Мужики засунули в машину тоненький прутик
"Вжик" сказала машина и перепилила прутик
"У бля" сказали мужики и засунули в машину бревно
"Вжик вжик" сказала машина и перепилила бревно
"Уу бля" сказали мужики и засунули в машину стальную проволочку
"Вжжик вжжжик вжжжик" сказала машина и перепилила проволочку
"Уууу блляяя" сказали мужики и засунули в машину большую рельсу
"Вжжжжик вжжжжж" сказала машина и сломалась
"А! бля" сказали мужики и пошли пилить дрова"
alsav22
5416 / 4812 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.01.2014, 22:49     Растолкуйте new с адресацией! #17
Цитата Сообщение от ValeryS Посмотреть сообщение
а мне одно интересно кто то этим в жизни пользуется?
Что есть в литературе.
Миниатюры
Растолкуйте new с адресацией!   Растолкуйте new с адресацией!   Растолкуйте new с адресацией!  

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

Простой пример. У класса widget нет конструктора по-умолчанию. Только с параметром.
Создать динамический массив объектов класса widget, запросив в консоли количество объектов и параметр каждого.
ValeryS
Модератор
6539 / 5005 / 461
Регистрация: 14.02.2011
Сообщений: 16,648
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++
Слово &quot;специфицировались&quot; никак понять не могу. Также, не могу понять как это так, чтоб на создаваемые классом объекты влияли...

Удаление узла бинарного дерева, проблема с функциями, адресацией - C++
код: #include &lt;cstdlib&gt; #include &lt;iostream&gt; typedef struct tree{ // обьявляем тип char data; //дата изьятия в формате xx.xx.xxxx ...

На Дваче анон поднял хитрый пример на тему ++i, растолкуйте мне, гики, а то я так ничего и не понял - C++
Цитирую...

Проблема с адресацией - Assembler
Точнее сказать проблема с моей головой, которая что-то не понимает..Мне нужно вывести надпись в установленном месте в функции, аргументом...


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

Или воспользуйтесь поиском по форуму:
alsav22
5416 / 4812 / 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 с адресацией!
Ответ Создать тему
Опции темы

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