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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
#1

Расскажите про new и delete в C++ - C++

26.10.2009, 14:03. Просмотров 1342. Ответов 7
Метки нет (Все метки)

Есть несколько вопросов:
1) Можно ли перегрузить несколько операторов new в разных пространствах имен, а потом просто писать
int *t = mini::new int; ???
2) Можно ли вызвать конструктор и деструктор в своем аллокаторе, без перегрузки new и delete?
И про эффективность:
3) if(hello) это долго? Hello булева переменная. Желательно в тактах.
4) struct hello
{
unsigned short omg : 15;
bool init : 1;
};
Работа с такой структурой дольше, чем с обычной? То есть стоит ли экономить 1 байт?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2009, 14:03     Расскажите про new и delete в C++
Посмотрите здесь:

C++ Расскажите пожалуйста про оператор "class" из учебника понял только как создать, как сделать содержимое открытым/закрытым...
C++ Вопрос про catch и delete
C++ Расскажите пожалуйста про флаги
C++ Каталоги VC++ расскажите нубу
C++ Расскажите как определиться начинающему
C++ В чем разница между delete и delete[]?
Расскажите популярно про ссылки и указатели C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 15:05     Расскажите про new и delete в C++ #2
Цитата Сообщение от ProNoooob Посмотреть сообщение
1)
Да.

Цитата Сообщение от ProNoooob Посмотреть сообщение
2)
Да.

Цитата Сообщение от ProNoooob Посмотреть сообщение
3)
Зависит от уровня косвенности. В пределах 2-7 машинных команд(не в тактах).

Цитата Сообщение от ProNoooob Посмотреть сообщение
4)
Не быстрее, не медленее.
Не стОит. Про выравнивание не забудь.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
26.10.2009, 15:31     Расскажите про new и delete в C++ #3
Цитата Сообщение от ProNoooob Посмотреть сообщение
4) struct hello
{
unsigned short omg : 15;
bool init : 1;
};
Работа с такой структурой дольше, чем с обычной? То есть стоит ли экономить 1 байт?
В общем случае работа идёт медленнее, т.к. при чтении-записи такой структуры требуется дополнительное построение битовой арифметики (не программисту требуется, а компилятор это делает). Замедление в зависимости от расположения поля (с краю подложки или в центре), архитектуры (есть или нет специальные операции по чтению/записи полей) может быть до 2 тактов на чтении и до 4 тактов на записи. При этом в случае нескольких подряд чтений или нескольких подряд записей за счёт оптимизаций потери могут сократиться. Если реально остро стоИт вопрос производительности, то работать с битовыми полями имеет смыл только тогда, когда программа будет потреблять много памяти.
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 15:38     Расскажите про new и delete в C++ #4
Цитата Сообщение от Evg Посмотреть сообщение
В общем случае работа идёт медленнее, т.к. при чтении-записи такой структуры требуется дополнительное построение битовой арифметики (не программисту требуется, а компилятор это делает)
Так это в компайл-тайм. (или нет? )
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
26.10.2009, 16:14     Расскажите про new и delete в C++ #5
Цитата Сообщение от niXman Посмотреть сообщение
Так это в компайл-тайм. (или нет? )
Компайл-тайм никто в принципе не рассматривает. Речь идёт только о генерируемом коде

Добавлено через 9 минут
Грубо говоря, когда ты делаешь запись НЕбитового поля, то это выражается в одну операцию записи в память. Когда делаешь запись битового поля, то сначала нужно прочитать из памяти подложку (а любая операция чтения из памяти - это само по себе уже не быстро, особенно, если данных в кэше не оказалось), при помощи битовых операций втиснуть в подложку битовое поле, а потом модифицированную подложку записать в память

Да хоть по ассемблерной выдаче сравни два варианта. Палками выделаю непосредственно операцию записи поля. Сначала обычное поле

C
1
2
3
4
5
6
7
8
9
10
struct s
{
  int x;
};
 
void
func (struct s *p, int val)
{
  p->x = val;
}
Код
func:
        pushl   %ebp
        movl    %esp, %ebp
        movl    12(%ebp), %edx
        movl    8(%ebp), %eax
        -----------
        movl    %edx, (%eax)
        -----------
        popl    %ebp
        ret
Теперь битовое. Самый общий вариант (поле не прижато)

C
1
2
3
4
5
6
7
8
9
10
11
12
struct s
{
  int  :1;
  int x:30;
  int  :1;
};
 
void
func (struct s *p, int val)
{
  p->x = val;
}
Код
func:
        pushl   %ebp
        movl    %esp, %ebp
        movl    8(%ebp), %ecx
        movl    12(%ebp), %edx
        -----------
        movl    (%ecx), %eax       <--- читаем подложку
        andl    $0x7ffffffe, %edx  <--- в записываемом значении обнуляем биты, которые мимо поля
        andl    $0x80000001, %eax  <--- в подложке обнуляем биты, соотвествующие полю
        orl     %edx, %eax         <--- записываем значение в подложку
        movl    %eax, (%ecx)       <--- записываем модифицированную подложку
        -----------
        popl    %ebp
        ret
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 16:16     Расскажите про new и delete в C++ #6
Evg, Да, и вправду. Просто мои познания ассемблера, оставляют желать лучшего.
Evg
Эксперт CАвтор FAQ
17411 / 5649 / 355
Регистрация: 30.03.2009
Сообщений: 15,467
Записей в блоге: 26
26.10.2009, 16:18     Расскажите про new и delete в C++ #7
Цитата Сообщение от niXman Посмотреть сообщение
Evg, Да, и вправду. Просто мои познания ассемблера, оставляют желать лучшего.
А знания ассемблера тут особено не при чём. Просто представь себе, что в Си нет битовых полей, а тебе надо сделать (ну или как вариант всё это же самое упаковать в int).
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.10.2009, 16:19     Расскажите про new и delete в C++
Еще ссылки по теме:

"delete [] a, b;" эквивалентно "delete [] a; delete [] b;"? C++
Чем отличается delete[] от delete? C++
C++ Расскажите по подробнее о mod
Расскажите про IDE Intel Parallel Studio XE 2015 C++
C++ Расскажите про "тру" метод парсинга строки

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

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
26.10.2009, 16:19     Расскажите про new и delete в C++ #8
Evg, Логически верно. Спасибо!
Yandex
Объявления
26.10.2009, 16:19     Расскажите про new и delete в C++
Ответ Создать тему
Опции темы

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